1

基本的に同じオブジェクトタイプのリストが2つあります。最初のもの(A、B、C、D)は、私のオブジェクトの1つのプロパティです。

オブジェクトの2番目のリスト(B、E、F)に参加する必要がありますが、重複を除外します。

これは私がただすることができないことを意味します:

    ListA.AddRange(ListB)

に変更する必要があります

    ForEach item in ListB
       If Not ListA.Contains(item)
          ListA.Add(item)
       EndIf
    Next

または追加:

    ListA = ListA.Distinct()

これをコーディングするためのより速くてスムーズな方法はありますか?

4

2 に答える 2

2

をすでにオーバーライドしていて、Equals直接使用GetHashcodeできる場合:Enumerable.Union

var ListC = ListA.Union(ListB).ToList();

それ以外の場合は、を実装IEqulityCompararer<Foo>して使用できますListA.Union(ListB, comparer)

仮定Fooはクラスのタイプであり、Name重複を検出するために使用するプロパティです。

public class FooComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo x, Foo y)
    {
        if (x == null || y == null) return false;
        // 'A' = 'a' just to demonstrate case-insensitive duplicates
        return x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(Foo obj)
    {
        if (obj == null) return int.MinValue;
        return obj.Name.GetHashCode();
    }
}

次に、このコンパレータを次の目的で使用しますUnion

var ListC = ListA.Union(ListB, new FooComparer()).ToList();
于 2013-01-28T12:58:19.463 に答える
0

これを行うためのより速い方法はありません。何をするにしても、両方のリストのすべての要素をチェックして重複していないかどうかを確認する必要があるため、独自のコードで実行するか、Linqを使用できます。

とにかく、list1.Count*list2.Count操作があります

于 2013-01-28T12:57:42.703 に答える