2011-10-20 3 views
6

IEnumerableはここで何度か議論されていますが、私は特定の質問に対する答えを見つけることができませんでしたので、私は新しい質問としてそれを取り上げています。これは「testlistという」の「フィルタ」だけではなく二つのアイテムを2回反復するが、実際にアイテムを引き起こすことを、IEnumerableの複数の列挙

static void Main(string[] args) 
    { 

     List<string> testList = new List<string> {"Test", "Test1", "Test1"}; 
     IEnumerable<string> filtered = testList.Where(x => x == "Test1"); 

     DoSomeWork(filtered); 
     DoSomeMoreWork(filtered); 
    } 

    public static void DoSomeWork(IEnumerable<string> items) 
    { 
     foreach (var item in items) 
     { 
      Console.WriteLine("do some work"); 
     } 
    } 

    public static void DoSomeMoreWork(IEnumerable<string> items) 
    { 
     foreach (var item in items) 
     { 
      Console.WriteLine("do some more work"); 
     } 
    } 

は、右のIアム:

は、次のコードを考えてみましょうか?したがって、 "testList"は10000個のアイテムを持つ大きなリストであり、 "filtered"は10個のアイテムに減らすことを考慮すると、リストを "フィルタリング"する(別名varを使用し、最後にToList()を追加する)

編集: これは私がこれまでに尋ねた中で最も恥ずかしい質問です。たとえば、IQueryableを反復することが悪いことは、DBからデータを2回取得することになるためです。しかし、私はメモリリストについては確かではありませんでした。私は;-) ultimatly IEnumrableから継承され

答えて

0

一覧はavaialble次のコンストラクタを使用して、あなたがIEnurableのリストを作成することができ、この

public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable 

もう一つをチェックすることができれば、私は質問を削除します

public List(
    IEnumerable<T> collection 
) 

EDIT

derivedi.eフィルタリングされたリストは、両方のメソッドで2回反復されますが、appe最後に.ToList()メソッド。

IEnumerable<string> filtered = testList.Where(x => x == "Test1").ToList(); 

http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx

+0

はい、わかっています。しかし、問題はです。DoSomeWork()とDoSomeMoreWork()の両方が大きなリストを反復させるか、サブセットのみを反復しますか? – Christoph

+0

@Christoph - 答えが今編集されました..... –

+0

この使用のためにToListを使用するほうが効率的ですが、最も重要なことに、追加/削除を許可しないため、不要な柔軟性が回避されますバグなど)。 –

1

大きなリストを二回繰り返したことになります。あなたがそれを望まないならば、あなたは制限を "実現"することができます。

var filtered = testList.Where(x => x == "Test1").ToList(); 

これを示す多くの回答があります。あなたは

0

:-)特にで、はい

(別名VARを使用して、ちょうど最後にToListメソッド()を追加)「フィルタ」リストを作るために、より巧妙になり、より良い検索しましたはずですLinq-To-Entitiesなどの用語

linqを使用してIEnumerableを返すと、実行が異なります。最後にToList()を追加すると、リストがすぐに返されます。

は大きなリストを二回繰り返したことになるhttp://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

7

を参照してください。これは本当ににあなたのクエリを変更する起こることを確認するには:あなたは「トンが== 『Test1を』部分にブレークポイントを設定した場合

List<string> testList = new List<string> { "Test", "Test1", "Test1" }; 
IEnumerable<string> filtered = from t in testList 
           where t == "Test1" 
           select t; 

、あなたはデバッガが両方の反復のために、この行を打つことがわかります。

+0

ああ、そうです。そのとおり。ヒントありがとう! – Christoph

関連する問題