2016-05-24 1 views

答えて

6

foreach(var x in objects.Distinct()) 
    Console.WriteLine(x); 

あなたがリストを必要としない、あなたはList.ForEach方法を必要としません。単純なループを使用してください。

どのような価値があるのか​​については、どのような種類の配列でもForEach extension methodです。あなたはこのコードを使用することができ、この拡張メソッドで

objects.Distinct().ForEach(Console.WriteLine); 
1

あなたにはありません。

.Distinct()はIEnumerableで動作するメソッドであり、 はIEnumerable(遅延評価された)を返します。 IEnumerableは シーケンスです。リストではありません。したがって、最後に リストにしたい場合は、最後に.ToList()を入れてください。

でも醜いていることhere

+0

これはなぜ機能しませんか? objects.Distinct()。Select(x => Console.WriteLine(x)) – Zwierzak

+0

@Zwierzak:2つの理由があります。最初は、あなたが本当にあなたの選択から返される何かを必要とすることです。コンパイラは、選択ラムダが戻ってきた型を調べることができないので、コンパイラはそれに不満を持ちます。あなたは '.Select(x => {Console。WriteLine(x); return x;}) 'しかし、遅延評価に問題があります。あなたが作成している 'IEnumerable'を列挙するまで、実際には' Console.WriteLine'を実行しません。これは、ToList()を呼び出すこと、または 'ToList()'を使うことを意味します... – Chris

+0

つまり、簡単にしようとすると、.Distinc()を呼び出すと、その時点でアクションは実行されません。 ).ToList()を呼び出すと、値が評価されます。 – Brduca

0

のための素晴らしい説明があり、マテリアは(最後.ToList()を入れて)行います:

objects 
    .Distinct() 
    .Select(x => { 
    Console.WriteLine(x); 
    return 1; // <- Select must return something 
    }) 
    .ToList(); // <- this will force Linq to perform Select 

より良いアプローチはちょうどです列挙

foreach (var x in objects.Distinct()) 
    Console.WriteLine(x); 
+0

最初のコードサンプルでは、​​Console.WriteLineが何も返さないため、おそらく例外があります。メソッド 'System.Linq.Enumerable.Select の型引数(System.Collections.Generic.IEnumerable 、System .Func ) 'を使用から推測することはできません。型引数を明示的に指定してみてください。 –

+0

@Chris Dunaway:私は本当に何かを返さなければならないのを見ました。私の編集を参照してください –

0

カスタムForEach拡張を作成することでこれを達成できます。

テストプログラム

public static void Main(string[] args) 
{ 
    var objects = new List<DateTime>(); 

    objects.Add(DateTime.Now.AddDays(1)); 
    objects.Add(DateTime.Now.AddDays(1)); 
    objects.Add(DateTime.Now.AddDays(2)); 
    objects.Add(DateTime.Now.AddDays(2)); 
    objects.Add(DateTime.Now.AddDays(3)); 
    objects.Add(DateTime.Now.AddDays(3)); 
    objects.Add(DateTime.Now.AddDays(4)); 
    objects.Add(DateTime.Now.AddDays(4)); 
    objects.Add(DateTime.Now.AddDays(5)); 
    objects.Add(DateTime.Now.AddDays(5)); 

    objects.Distinct().ForEach(x => Console.WriteLine(x.ToShortDateString())); 
} 

拡張

public static class Extensions 
{ 
    public static void ForEach<ST>(this IEnumerable<ST> source, Action<ST> action) 
    { 
     IEnumerator<ST> enumerator = source.GetEnumerator(); 
     while (enumerator.MoveNext()) 
      action(enumerator.Current); 
     enumerator.Dispose(); 
    } 

    // OR 

    public static void ForEach<ST>(this IEnumerable<ST> source, Action<ST> action) 
    { 
     foreach (var item in source) 
      action(item); 
    } 
} 

PS

あなたはLINQ-2-SQLを使用している場合は、これがないということを覚えておいてくださいlinq2sqlクエリはspの後にのみ評価されるためToList,AsEnumerableまたはFirstOrDefault(およびその他のもの)のようなエコな行動。

+0

なぜ、foreachを使うのではなく、あなたのソースを明示的に列挙していますか? – Chris

+0

ほとんどの習慣... 2年前に私はforeachのパフォーマンスについて何かを読んできました。私が機会を得たときには、列挙子を使ってコードを書いています(そのコードはあまり見られません)。 –

+0

しかし、列挙子が使い捨てであれば自動的に破棄されるので、foreachが優れています。 –

関連する問題