LINQ - 检查连接内是否相等

时间:2014-07-14 09:51:35

标签: c# linq join

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

例如,

假设我使用Name和Number属性实现了SomeData类。我制作了这个类的三个不同的实例,并将它们存储在List<>中。对象

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
          {
          ...
          }
      });

我唯一真正喜欢的是我在#34;非SQL语法中得到答案&#34;。

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

会做得很好。

1 个答案:

答案 0 :(得分:1)

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);