2016-09-16 5 views
1

私は、各グループ内に複数の画像があり、文字列基準に基づいて単一の画像を抽出する必要があるシナリオがあります。優先度条件に基づいて単一項目を取得する最も効率的な方法

以下は現在行われている方法です。しかし、わからないこれが最も効率的な方法、性能、サイズであれば、多分あまりにも賢明な練習

   foreach (var g in groups) 
       { 
        SomeType file = null; 

        if (file == null) 
        { 
         file = g.Where(i => 
           i.URL.Contains("StringA") 
           ).FirstOrDefault(); 
        } 
        if (file == null) 
        { 
         file = g.Where(i => 
            i.URL.Contains("StringB") 
           ).FirstOrDefault(); 
        } 
        if (file == null) 
        { 
         file = g.Where(i => 
           i.URL.Contains("StringC") 
           ).FirstOrDefault(); 
        } 
        if (file == null) 
        { 
         // etc... 
        } 
        if (file == null) 
        { 
         file = g.FirstOrDefault(); 
        } 
       } 
+1

あまりにも広すぎる:コードスタイルは、その部分を無視して、サイズ - あなたは明らかにループにリファクタリングすることができます(あなたが求めている疑いはありません)。あなたが使用しているLINQプロバイダーの種類... –

+0

これを行うにはより効率的な方法がありますが、LINQではありません。(少なくとも私は方法を考えることはできません) –

+0

@AlexeiLevenkov、LINQの意味を説明してくださいプロバイダ? System.Linqは標準であり、しばしばMoreLinqライブラリを使用します...それは決して退屈ではありませんでした:)私は私のアプローチで決して確信していませんでした...私は他の開発者が素晴らしいと思う方法に晒されていると思います! – usefulBee

答えて

2

私はあなたが少し退屈なこの答えを見つけるかもしれない怖いが、私はいくつかの非常にimpressive-を見つけようとして避けるだろう複雑なlinqクエリです。私はそれができると確信していますが、それは頭痛の価値がない。

すべての文字列を配列に貼り付け、優先度の順にチェックしてください。多数のアイテムを走らせているのでなければ、それは十分に速く十分です。あなたはdbクエリを実行していません - あなたのforeachループはあなたのデータがすでにメモリにあることを明らかにします。

だから、私はif文の大きな失うとの線に沿って何かを目指したい:私は、非常にエキサイティングではない言ったように

string [] my_list = new string [] {"StringA", "StringB", "StringC"}; 

foreach (var g in groups) 
{ 
    foreach (string s in my_list) 
    { 
     file = g.Where(i => i.URL.Contains(s)).FirstOrDefault(); 
     if (file != null) 
      break; 
    } 
    if (file == null) 
    { 
     file = g.FirstOrDefault(); 
    } 
} 

が、それはあなたの検索であなたの優先順位を変更するのは簡単死んだと\または文字列を追加および削除します。

HTH、

アダム。

+0

あなたの前提はすべて正しいです。私はContainsステートメントを編集してsバリデーションを渡しました...優秀なアプローチ – usefulBee

+0

私はこのアプローチを適用し、パフォーマンスの向上に驚いています!また、非常に汎用性があり、アプリのニーズとさまざまな優先順位に基づいてさまざまなリストを作成することができます。うれしい私は尋ねた! – usefulBee

1
string [] my_list = new string [] {"StringA", "StringB", "StringC"}; 
foreach (var g in groups) 
{ 
    SomeType file = g.FirstOrDefault(i => my_list.Any(l=>i.Url.Contains(l))) 
            ?? g.FirstOrDefault(); 

} 
+0

私の最後のコメントを取り戻さなければならなかった。アプローチが有望に見えたとしても、優先順位が保証されませんでした - StringAが利用可能なときにStringBとCを持つアイテムが見つかりました – usefulBee

0
string[] filters = new[] { "StringA", "StringB", "StringC" }; 

foreach (var g in groups) 
{ 
    SomeType file = filters.Select(s => g.FirstOrDefault(i => i.URL.Contains(s))) 
          .FirstOrDefault(m => m != null); 
} 

それとも、あなたはループ全体を交換し、実際にどこかに結果を保存したい場合:

ところで
var files = groups.Select(g => filters.Select(s => g.FirstOrDefault(i => i.URL.Contains(s))) 
             .FirstOrDefault(m => m != null)); 

file = g.Where(somePredicate).FirstOrDefault();

のような表現が可能

file = g.FirstOrDefault(somePredicate);

関連する問題