如何将其转换为Linq?

时间:2013-05-30 08:49:09

标签: linq for-loop

我得到了另一个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,但基本上是相同的代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

您可以覆盖课程上的the Equals methodimplement an IEqualityComaprer<Number>,而不是使用where子句。然后你可以使用the Intersect Linq method

这样的事情:

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
}

这当然假设您已修复代码以便进行编译,因此num1num2引用Number类的集合,而不是单个{{1实例。你写的代码中存在很多问题,所以我会把这个问题留给你解决。