我有以下对象:
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。
任何帮助深表感谢!人
如果你不介意使用方法语法而不是查询语法,那么这段代码怎么样呢。
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();