0

我遇到了另一个 Linq 问题。因为我不确定是否还有其他方法可以做到这一点。这是我要转换的内容:

class ID
{
 public string name {get; set;}
 public int id {get; set;}
}

ID[] num1 = new ID[2] { {"david",1} , {"mark",2} };
ID[] num2 = new ID[3] { {"david",1} , {"david",2} };

for(int i = 0; i < num1.Length; i++)
{
 for(int j = 0; j < num2.Length; j++)
 {
  if(num1.name.Equals(num2.name) && num1.num == num2.num)
  {
   Console.Writeline("name: " + num1.name + " id: " + num1.id);
   //Do something
   break; //to avoid useless iterations once found
  }
 }
}

这不是一个完美的代码,但希望它能够捕捉到我想要做的事情。目前我正在 Linq 中实现这个,如下所示:

var match = 
from a in num1
from b in num2
where (a.name.Equals(b.name) && a.num == b.num)
select a;
//do something with match

我对 Linq 很陌生,所以我不确定这是否是最好的方法,或者是否有更“简单”的方法。因为看起来我只是将它转换为 linq 但本质上是相同的代码。

谢谢!

4

1 回答 1

1

您编写的 Linq 代码已经在解决问题的正确轨道上,尽管它不是解决问题的唯一方法。

where您可以覆盖类上的Equals方法或者实现一个IEqualityComaprer<Number>. 然后你可以使用LinqIntersect方法

像这样的东西:

public class Number
{
    public override bool Equals(object other)
    {
        var otherAsNumber = other as Number;
        return otherAsNumber != null
            && (otherAsNumber.Name == null
                ? this.Name == null
                : otherAsNumber.Name.Equals(this.Name)
            )
            && otherAsNumber.Num == this.Num
            ;
    }

    // ...
}

// ...

var result = num1.Intersect(num2);

foreach(var item in result)
{
    // Do something
}

这当然假设您已经修复了代码,以便它可以编译,num1并且num2引用Number类的集合,而不是单个Number实例。您编写的代码中存在很多问题,因此我将解决该问题留给您。

于 2013-05-30T08:56:55.183 回答