8

LinqQuery.ToList()。Distinct()LinqQuery.Distinct()。ToList();の違いを知ることができません。私にとっては両方とも同じように見えます。

このサンプルコードを検討してください:

List<string> stringList = new List<string>();

List<string> str1  = (from item in stringList
                                select item).ToList().Distinct();

List<string> str2 = (from item in stringList
                                 select item).Distinct().ToList();

str1は次のようなエラーを示します:「タイプ'System.Collections.Generic.IEnumerable'を'System.Collections.Generic.List'に暗黙的に変換できません。明示的な変換が存在します(キャストがありませんか?)」

ただし、str2のエラーはありません。

これら2つの違いを理解するのを手伝ってください。ありがとう

4

1 に答える 1

19

.Distinct()を操作し、(遅延評価)IEnumerable<T>返すメソッドです。IEnumerable<T>AnIEnumerable<T>はシーケンスです:それはではありませList<T>。したがって、リストを作成する場合は.ToList()、最後にを付けてください。

// note: this first example does not compile
List<string> str1  = (from item in stringList
                            select item) // result: IEnumerable<string>
                         .ToList() // result: List<string>
                         .Distinct(); // result: IEnumerable<string>

List<string> str2 = (from item in stringList
                             select item) // result: IEnumerable<string>
                         .Distinct() // result: IEnumerable<string>
                         .ToList(); // result: List<string>

これがなぜそうなのかを説明するために、次の大まかな実装を検討してDistinct()ください。

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source) {
    var seen = new HashSet<T>();
    foreach(var value in source) {
        if(seen.Add(value)) { // true == new value we haven't seen before
            yield return value;
        }
    }
}
于 2012-09-18T07:06:35.743 に答える