LINQ -检查连接内部是否相等

本文关键字:是否 内部 连接 检查 LINQ | 更新日期: 2023-09-27 18:12:41

是否可以检查LINQ Join方法中第一个对象(不)是否等于第二个对象?

例如,

假设我实现了带有Name和Number属性的SomeData类。我为这个类创建了三个不同的实例,并将它们存储在List<> object中。

List<SomeData> data = new List<SomeData>();
SomeData a = new SomeData();
SomeData p = new SomeData();
SomeData v = new SomeData();
a.Name = "Ann";
a.Number = 1;
p.Name = "Peter";
p.Number = 4;
v.Name = "Vicky";
v.Number = 1;
data.Add(a);
data.Add(p);
data.Add(v);

现在,我想得到一个新的SomeData对象,它是用两个SomeData实例在数据列表中创建的,具有相同的Number属性。

var joinedData = data
.Join(first => first.Number,
     second => second.Number,
     (first, second) => new SomeData
     {
         Name = first.Name + " & " + second.Name,
         Number = first.Number
      });

然而,当这个查询执行时,即使第一个和第二个是相同的实例,它也会创建对象。有没有办法检查这个内部查询?就像

var joinedData = data
.Join(first => first.Number,
      second => second.Number,
      if (first != second)
      {
          (first, second) => new SomeData
          {
          ...
          }
      });

我唯一想要的是,我得到答案在"非sql类语法"。

EDIT1:代码

的当前输出
foreach(SomeData sd in joinedData)
{
 Console.Writeline (sd.Name)
}

Peter & Peter
Vicky & Vicky
Vicky & Ann
Ann & Vicky
Ann & Ann

,期望输出为

Ann & Vicky

对,实际上上面是理想的输出,但是,

Ann & Vicky
Vicky & Ann

LINQ -检查连接内部是否相等

Join在默认情况下是这样做的(即使用x = equals (y)的默认比较器)

如果你需要一个自定义的比较,你可以使用重载,你给一个IEqualityComparer(见MSDN)

var myComparer = new MyComparer();  //Must implement IEqualityComparer<T>
var joinedData = data.Join(other, first => first.Number, second => second.Number, (first, second) => {...}, myComparer);