是否可以检查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
会做得很好。
答案 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);