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 没有错误。

请帮助我了解这两者之间的差异。谢谢

4

1 回答 1

19

.Distinct()是一种对 进行操作IEnumerable<T>返回一个IEnumerable<T>(惰性求值)的方法。AnIEnumerable<T>是一个序列:它不是一个List<T>. 因此,如果您想以列表结尾,请将 the.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 回答