2016-08-10 4 views
2

重複しない:これは私の具体的なケースで重複しているとは思わないが、実際には警告を無視する方が良いと感じている。例えばResharperの '可能な複数のIEnumerable警告の列挙'

IEnumerable<Item> milionItems = GetAMillionItemsFromDatabase(); 

var item1 = millionItems.FirstOrDefault(x=> x.Condition == "Excellent"); 

var item2 = millionItems.FirstOrDefault(x=> x.Condition == "Good"); 

は、私が「millionItems」の下に警告メッセージが表示されますし、私はそれはしかし、私はそれはちょうどそれを取り除くために、常にToList'ing価値があるかどうかわからないんだけど何を意味するか知っています。

GetAMillionItemsFromDatabase().ToList(); 

これは、一度に100万件のレコードをメモリに持ち込むので、パフォーマンスが賢明ではないようです。

しかし、私はそれをしないで、IEnumerableを列挙し、データベースに2回ヒットしても、最初に一致するアイテムを見つけて返すようにすべてのデータを取り込むわけではありません。この場合、実際にはメッセージを無視する方が良いと思われます。

+0

もちろん、*警告を無視することもできます。それは何が列挙されているかによって異なります。 'IEnumerable'を実装するいくつかのクラスは、それらを2回列挙しようとすると空のコレクションを返します。あなたのケースで何が最善であるかを判断する必要があります:リスト内のすべてのアイテムを保持するか、複数の潜在的に高価なデータベースコールを作成する、あるいはLINQを先取りして、item1とitem2を単一のパスでデータ。この場合も 'Enumerable.Aggregate' *が役に立つかもしれません。 –

答えて

5

現在のコードで実行されるIEnumerable経由のクライアント側検索よりも、この場合2回DBに行くほうがよいでしょう。

foreach(var x in millionItems) 
    { 
    item1 = item1 == null && x=> x.Condition == "Excellent" ? x : item1; 
    item2 = item2 == null && x=> x.Condition == "Good" ? x : item2; 

    if (item1 != null && item2 != null) 
    { 
      break; 
    } 
    } 

がこれにチャンスを持っている:あなたはDBへの検索をプッシュすることができない場合

あなたはまだ多少の各項目の両方の条件をチェックして検索を最適化することができます(チェーン接続できるようにするIQueryable<Item>を保つことによってIE)クライアント側も多くの項目を通過しますが、少なくとも同時にそれらをメモリに保持しません。

ToListでリストに変換するのは、作成する必要があるクエリが2つであれば、それほど良いとは言えません。

関連する問題