【问题标题】:Search a multidimensional array object's content using linq使用 linq 搜索多维数组对象的内容
【发布时间】:2017-12-22 03:40:31
【问题描述】:

我有以下对象:

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 包含在其任何变量(字幕、文本和/或列表)中输入的字符串值。

我正在尝试执行以下等效操作:

因此,如果我想从 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】:

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

    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 在 cmets 中指出的那样,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();
    

    【讨论】:

    • r.Content.SelectMany(o => o)可以简化表达
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多