gpt4 book ai didi

c# - 为什么 .ToList().Distinct() 抛出错误而不是 .Distinct().ToList() 与 linq 查询

转载 作者:太空狗 更新时间:2023-10-29 19:56:05 27 4
gpt4 key购买 nike

我不知道 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 没有错误。

请帮助我理解这两者之间的区别。谢谢

最佳答案

.Distinct()是一种对 IEnumerable<T> 进行操作的方法,并且返回一个IEnumerable<T> (懒惰地评估)。一个IEnumerable<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;
}
}
}

关于c# - 为什么 .ToList().Distinct() 抛出错误而不是 .Distinct().ToList() 与 linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com