我得到了另一个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,但基本上是相同的代码。
谢谢!
答案 0 :(得分:1)
您编写的Linq代码已经在正确的轨道上解决问题,但它不是解决问题的唯一方法。
您可以覆盖课程上的the Equals
method或implement 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
}
这当然假设您已修复代码以便进行编译,因此num1
和num2
引用Number
类的集合,而不是单个{{1实例。你写的代码中存在很多问题,所以我会把这个问题留给你解决。