【问题标题】:LINQ - check for equality inside joinLINQ - 检查连接内的相等性
【发布时间】:2014-07-14 09:51:34
【问题描述】:

是否可以在 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
      });

但是,当这个查询执行时,即使 first 和 second 是相同的实例,它也会创建对象。有没有办法检查这个内部查询?类似的东西

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

我唯一真正想要的是我得到“非 SQL 类语法”的答案。

编辑1: 当前输出带代码

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

会很好。

【问题讨论】:

  • 能否为您展示的样本数据提供所需的输出?
  • "非 SQL 类语法" = Lambda
  • 你到底想在这里做什么?即使您删除了名称相同的条目,您仍然会得到一个“Ann & Vicky”和另一个“Vicky & Ann”。
  • @BenAaronson 我不是要比较名称(对象的属性),而是对象本身 - 例如if(v != s),而不是 if(v.Name != s.Name)

标签: c# linq join


【解决方案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);

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2015-08-09
    • 2015-11-23
    相关资源
    最近更新 更多