2009-10-08 29 views
8

以下の例では、をList<int>に簡単に変換して、prettyPrintのパラメータとして使用できますか?System.Linq.Enumerable.WhereListIterator <int>をどのようにリスト<int>に変換しますか?

Console.WriteLine("Example of LINQ's Where:"); 
List<int> scores = new List<int> { 1,2,3,4,5,6,7,8 }; 
var evenScores = scores.Where(i => i % 2 == 0); 

Action<List<int>, string> prettyPrint = (list, title) => 
    { 
     Console.WriteLine("*** {0} ***", title); 
     list.ForEach(i => Console.WriteLine(i)); 
    }; 

scores.ForEach(i => Console.WriteLine(i)); 
prettyPrint(scores, "The Scores:"); 
foreach (int score in evenScores) { Console.WriteLine(score); } 

答えて

20

あなたはToListメソッドの拡張機能を使用したい:あなたはスコアパラメータのためのそのような特定のタイプで、唯一のIEnumerableとして、このパラメータを使用するよりも、prettyPrintを宣言します(私はこれがあなたが実装する方法であると仮定し、なぜちなみに

var evenScores = scores.Where(i => i % 2 == 0).ToList(); 
+5

Pfft 、遅いコード! i =>(i&1)== 0 – leppie

+23

Pfft、プロファイリングによって駆動されないマイクロ最適化。イテレータとリストへのコピーの作成は、数学をマイクロ最適化することによって行われる節約より数百倍遅くなります。 *遅いものを最適化する* –

9
var evenScores = scores.Where(i => i % 2 == 0).ToList(); 

動作しませんか?

1

をFor Each拡張メソッド)?だから、prettyPrintシグネチャを変更して、これを怠惰に評価しないようにしてください。 =)このよう

Action<IEnumerable<int>, string> prettyPrint = (list, title) => 
{ 
    Console.WriteLine("*** {0} ***", title); 
    list.ForEach(i => Console.WriteLine(i)); 
}; 

prettyPrint(scores.Where(i => i % 2 == 0), "Title"); 

更新:

それとも、)アカウントの文字列連結の非効率になりません(このようList.ForEach使用を避けることができます。

var text = scores.Where(i => i % 2 == 0).Aggregate("Title", (text, score) => text + Environment.NewLine + score); 
+1

'ForEach'は' List 'クラスの組み込みメソッドである可能性があります。 'ForEach'を' IEnumerable 'と一緒に使うための独自の拡張メソッドを書く必要があります。 – LukeH