LINQ

2017-12-22 10 views
1

を使用して多次元配列オブジェクトの内容を検索するI以下のオブジェクトがあります。LINQ

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を返すようにしようとしています字幕、テキスト、および/またはリスト)。

私は次の同等のやろうとしています:、私はRandomModelから名前のテキスト内の文字列検索入力を検索すると、それは検索文字列が含まれていない場合は、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を返します。

ご協力いただきありがとうございます。 Al

答えて

1

クエリ構文の代わりにメソッド構文を使用しても構いません。その場合には、それは次のようになりますので、私は通常、大文字小文字を区別しない検索を実行するためにIndexOfを使用

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(); 

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を入力することができます。

編集:コメントの後ろに指摘されているように、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(); 
+0

'r.Content.SelectMany(O => O)'これはかなり役立ちますすごい、これは偉大な情報のおかげで – Backs

+0

式を簡素化することができます! – Baraa