0

DB から取得した 2 つのオブジェクト配列があり、一部重複しているため、別個の関数を作成する必要があります。

ラムダ式を作成しようとしましたが、まだオブジェクトが重なっています。

これは私のコードです:

ArtObject[] pinui = new ArtObject[root.Count - 1];
ArtObject[] c1=     new ArtObject[root2.Count - 1];

pinui = getArticlesArray(root2, pinui);
c1= getArticlesArray(root, c1);

art = new ArtObject[c1.Count()+pinui.Count()];

pinui.CopyTo(art, 0);
c1.CopyTo(art, pinui.Count());

art = art.Distinct().OrderByDescending(a => a.dateTosort).ToArray();

最後の行に何か問題があると思いart = art.Distinct().OrderByDescending(a => a.dateTosort).ToArray();ます..何をどのようにして個別のオブジェクトのみを取得できるのだろうか..?

4

3 に答える 3

5

Distinctと を使用EqualsGetHashCodeて等しい値を決定します。これらのメソッドをオーバーライドして、同等性をチェックする方法を示していないと思います。

また、最後の部分は次のように単純になることに注意してください。

ArtObject[] art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();

a.Union(b)と同等a.Concat(b).Distinct()です。

GetHashCodeandをオーバーライドする代わりに、 または のいずれかにEqualsを指定することもできます。IEqualityComparer<Person>UnionDistinct

MoreLINQDistinctByは、メソッドを使用してこれを簡単にします。

var query = collection.DistinctBy(x => x.Description);

(これに相当するものはUnionまだありませんが、簡単に追加できます。)

于 2012-09-20T09:17:56.550 に答える
2

フィールドの 1 つを区別する場合は、GroupBy次に getを使用できFirstます。

pinui.Concat(c1).GroupBy(a => a.Description, (key, g) => g.First())
    .OrderByDescending(a => a.dateTosort).ToArray();
于 2012-09-20T09:40:39.480 に答える
2

コードは短くできますが、問題ないように見えます (CopyTo を使用する必要はありません)。

 var art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();

Unionのような重複はすでに削除されていDistinctます。

オブジェクトが重複として検出されない理由は、おそらくそれらが異なるためです。たとえば、デフォルトでは、

 var obj1 = new ArtObject("Picasso");
 var obj2 = new ArtObject("Picasso");

2 つの別個のオブジェクトです。

ただし、またはにカスタム等値比較子を提供することはできます。リンクされた MSDN ページには良い例が含まれています。DistinctUnion

于 2012-09-20T09:19:52.963 に答える