使用linq搜索多维数组对象的内容

问题描述 投票:1回答:1

我有以下对象:

public class RandomModel : Metadata
{
    public string Name { get; set; }
    public ContentMod[][] Content { get; set; }

    public class ContentMod
    {
        public string Subtitle { get; set; }
        public string Text { get; set; }
        public string[] List { get; set; }
    }
}

我正在尝试搜索并返回包含ContentMod的RandomModel,该ContentMod包含在其任何变量(Subtitle,Text和/或List)中输入的字符串值。

我试图做相当于以下的事情:

因此,如果我想从RandomModel中搜索Name文本中的字符串搜索输入,并且如果它确实包含搜索字符串,则返回RandomModel,我会执行以下操作:

var randomContent = (from item in RandomContent
                     where item.Name.ToUpper().Contains(search)
                     select item).ToList();

现在我试图在ContentMod的所有参数中搜索文本。

类似于以下内容:

var randomContent = (from item in RandomContent
                     where item.ContentMod.???.ToUpper().Contains(search)
                     select item).ToList();

我似乎无法搞清楚???以上部分。我如何使用linq迭代多维对象的内容,如果它们包含字符串搜索,则返回RandomModel。

任何帮助深表感谢!人

c# .net linq multidimensional-array
1个回答
1
投票

如果你不介意使用方法语法而不是查询语法,那么这段代码怎么样呢。

var randomContent = models.Where(r => r.Content.Any(x =>
{
    return x.Any(y =>
    {
        return y.Text.ToUpper().Contains(search)
            || y.Subtitle.ToUpper().Contains(search)
            || y.List.Any(z => z.ToUpper().Contains(search));
    });
})).ToList();

我通常使用IndexOf进行不区分大小写的搜索,因此在这种情况下它看起来像这样。

var randomContent = models.Where(r => r.Content.Any(x =>
{
    return x.Any(y =>
    {
        return y.Text.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0
        || y.Subtitle.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0
        || y.List.Any(z => z.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0);
    });
})).ToList();

您可以根据需要调整StringComparison

编辑:正如评论中的Backs所指出的,SelectMany可以用来给你这个。

var randomContent = models.Select(r => r.Content.SelectMany(o => o.Where(x =>
{
    return x.Text.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0
        || x.Subtitle.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) >= 0
        || x.List.Any(y => y.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) >= 0);
}))).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.