使用linq转换列表<;列表<;T>&燃气轮机;列出<;T>;删除重复项
我的T类定义如下:使用linq转换列表<;列表<;T>&燃气轮机;列出<;T>;删除重复项,linq,Linq,我的T类定义如下: public Class T { public int myKey{get;set;} public datetime other {get;set;} } 如何使用Linq将列表转换为列表,排除重复项 如果没有Linq,这可以通过以下代码片段轻松完成: List<T> r = new List<T>(); foreach (var i in t) { foreach (var j in i) { if (!r.Sel
public Class T
{
public int myKey{get;set;}
public datetime other {get;set;}
}
如何使用Linq将列表
转换为列表
,排除重复项
如果没有Linq,这可以通过以下代码片段轻松完成:
List<T> r = new List<T>();
foreach (var i in t)
{
foreach (var j in i)
{
if (!r.Select(x=>x.myKey).ToList().contains(j.myKey))
{
r.Add(new T(){myKey= j.myKey, other=j.other});
}
}
}
List r=newlist();
foreach(t中的变量i)
{
foreach(i中的变量j)
{
如果(!r.Select(x=>x.myKey).ToList()包含(j.myKey))
{
r、 添加(newt(){myKey=j.myKey,other=j.other});
}
}
}
该代码段似乎有效,但不是最优雅的。您可以使用
SelectMany
将列表展平,并使用Distinct
获得不同的结果
var items = source.SelectMany(x => x).Distinct().ToList();
但它需要您重写T
类中的GetHashCode
和Equals
方法。可能是这样的:
public override int GetHashCode()
{
return myKey.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as T;
return other != null && other.myKey == myKey && other.other == other;
}
您可以使用
SelectMany
将列表展平,并使用Distinct
获得不同的结果
var items = source.SelectMany(x => x).Distinct().ToList();
但它需要您重写T
类中的GetHashCode
和Equals
方法。可能是这样的:
public override int GetHashCode()
{
return myKey.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as T;
return other != null && other.myKey == myKey && other.other == other;
}
您的代码段实际上在其.Select()和.ToList()调用中使用了Linq。您的代码段实际上在其.Select()和.ToList()调用中使用了Linq。为什么
GetHashCode
?它使用哈希集?一种。它使用名为Set
的内部类,它是System.Linq
命名空间的一部分。为什么GetHashCode
?它使用哈希集?一种。它使用名为Set
的内部类,该类是System.Linq
命名空间的一部分。