2

クラスのオブジェクトを含むリストがあります。intやdouble配列などのさまざまな項目を含むクラス。クラスはこんな感じ。

public class NewChildren
{
    public double[] fitnessValue{get;set;}

    public int[] locationScheme{get;set;}

    public double crowdingDistance{get;set;}
}

リストに重複するアイテムが含まれている可能性があるため、それらを削除することに興味があります。Webで、Distinct()メソッドとGroupBy()メソッドを使用するLinqに基づくいくつかのソリューションを見てきました。ただし、オブジェクトに配列があるため、これらのメソッドは機能しないようです(MSVS2008ではエラーは発生しませんが、アイテムも削除されません)。

任意の提案(参照またはコードを含む)は大歓迎です。前もって感謝します。

4

3 に答える 3

1

ドキュメントに記載されているように、デフォルトでDistinctはデフォルトの等式比較器を使用します。このデフォルトの等式比較器は、インスタンスのIDをチェックするため、リスト内の各項目を他のすべての項目とは異なるものとして認識します。

前述のドキュメントで述べたように、カスタムタイプを比較し、必要に応じて等価性を定義するには、クラスにいくつかの比較関連のメソッドを実装する必要があります。

カスタムデータ型を比較す​​るには、[ IEquatable<T>]を実装し、その型に独自のメソッドを提供するGetHashCode必要Equalsがあります。

于 2012-09-17T14:55:20.577 に答える
1

あなたが自分自身に尋ねなければならない質問は、2つのインスタンスがNewChildren同じであるときですか?そこにリストがあるので、これは答えるのが簡単な質問ではないかもしれません。これを定義したら、クラスにequalityメソッドを実装する必要があります。

public class NewChildren
{
    public double[] fitnessValue{get;set;}

    public int[] locationScheme{get;set;}

    public double crowdingDistance{get;set;}

    public bool override Equals(object other)
    {
        // ... implement your rules for equality here
    }
}

これを行うには、常にMicrosoftのガイドラインに従う必要があります。平等のオーバーライドはそれほど単純ではありませんが、複雑ではありません。例として、同じ要素を持つすべての配列がある場合:

public bool override Equals(object other)
{
    if (other == null || !(other is NewChildren)) 
    {
        return false;
    }

    var another = (NewChildren)other;

    return AreEquivalent(this.fitnessValue, another.fitnessValue)
        && AreEquivalent(this.locationScheme, another.locationScheme)
        && AreEquivalent(this.crowdingDistance, another.crowdingDistance);

}

public static bool AreEquivalent<T>(T[] a, T[] b)
{
    return a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a));
}

配列の等式の実装はここから取られました。このリファレンスを使用して最適化できます。

于 2012-09-17T15:02:39.843 に答える
0

クラスから作成されたオブジェクトのEqualsメソッドとequal演算子は、デフォルトで参照の同等性をチェックすることによって評価されます。つまり、2つの項目は、クラスの同じインスタンスを参照する場合にのみ等しくなります。クラス内の個々のプロパティを確認するためにクエリを変更するか、適切なメソッドと演算子のオーバーライドを実装する必要があります。

MSDNで以下を参照してください。

于 2012-09-17T14:59:44.447 に答える