使用linq转换列表<;列表<;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

我的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.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
命名空间的一部分。