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をオーバーライドするか . 次に、Linq メソッドを使用できます。EqualsIEqualityComaprer<Number>Intersect

このようなもの:

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を前提としています。あなたが書いたコードには多くの問題があるので、その問題の修正はあなたに任せます。num2NumberNumber

于 2013-05-30T08:56:55.183 に答える