4

結合を形成する必要がある 2 つのリストがありますが、.NET 2.0 を使用しているため、Union() メソッドが使用されていないように見えます。これらは整数のリストなので、等値比較に問題はありません。これについて行く良い方法は何ですか?

4

4 に答える 4

3

それらを一緒に追加して、重複を削除することができます:

  public List<T> Union<T>(List<T> firstList, List<T> secondList)
  {
     Dictionary<T, int> tmp = new Dictionary<T, int>();

     foreach (T val in firstList)
     {
        tmp[val] = 1;
     }

     foreach (T val in secondList)
     {
        tmp[val] = 1;
     }

     return new List<T>(tmp.Keys);
  }
于 2009-11-22T01:00:54.697 に答える
3

(辞書キーをハッシュテーブルとして使用)についてはどうですか:

public static List<T> Union<T>(List<T> first, List<T> second) {
    List<T> newList = new List<T>(first.Count + second.Count);
    Dictionary<T, object> firstItems = new Dictionary<T, object>(first.Count);

    foreach (T item in first) {
        newList.Add(item);
        firstItems.Add(item, null); 
    }

    foreach (T item in second) {
        if (!firstItems.ContainsKey(item)) {
            newList.Add(item);
        }
    }

    return newList;
}

firstこれにより、とのアイテムの順序が維持されsecondますが、リスト間の重複アイテムには O(1) チェックが引き続き使用されます。

于 2009-11-23T11:45:31.567 に答える
1

Visual Studio 2008 を使用している場合は、 linqbridgeを使用して、Framework 2.0 をターゲットにしながら LINQ to Objects を使用できます。

そして、プッシュ、プッシュ、プッシュして.NET 3.5に移行します。LINQ とラムダは、コードに対する考え方を変えます (より良いのは、私見です)。

于 2009-11-22T05:16:59.850 に答える
1

まだリストにない要素のみを追加する単純な foreach はどうですか。

foreach (int item in list2)
{
    if (!list1.Contains(item))
    {
        list1.Add(item);
    }
}

これにより、リストの順序が保持されます。

于 2009-11-22T01:55:14.353 に答える