3

List2を取得してList1の最後に追加する簡単で効果的な方法は何ですか?ただし、連結前にList1にまだ含まれていない項目のみが追加されるようにするにはどうすればよいでしょうか?

編集: ここで回答で提案されている方法を試してきましたが、それでもList1に重複が追加されます!
これはコード例です:

// Assume the existence of a class definition for 'TheObject' which contains some 
// strings and some numbers.

string[] keywords = {"another", "another", "another"};
List<TheObject> tempList = new List<TheObject>();
List<TheObject> globalList = new List<TheObject>();

foreach (string keyword in keywords)
{
    tempList = // code that returns a list of relevant TheObject(s) according to
               // this iteration's keyword.
    globalList = globalList.Union<TheObject>(tempList).ToList();
}

デバッグ時 (2 回目の繰り返しの後)、globalList には、TheObject のまったく同じオブジェクトの 2 つのコピーが含まれます。Edward Breyのソリューションを実装しようとすると、同じことが起こります...

EDIT2:
新しい tempList を返すコードを修正し、返された項目が既に globalList にあるかどうかを確認するようにしました (!globalList.contains() を実行して) - 現在は動作しています。
ただし、これは回避策です...

4

3 に答える 3

4

List1.Union(list2)。その他の例については、http: //code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b にアクセスしてください。

于 2012-04-16T04:25:49.743 に答える
2

次のようなリストの Union メソッドを使用できます

List1.Union(list2);
于 2012-04-16T04:26:01.193 に答える
1

UnionList1 のすべての項目が異なる場合、LINQは機能します。それ以外の場合は、O(m*n) の検索時間を必要とせずに、指定された目標をより正確に達成するために、ハッシュ セットを使用できます (Tリストのタイプに置き換えます)。

var intersection = new HashSet<T>(List1.Intersect(List2));
List1.AddRange(List2.Where(item => !intersection.Contains(item)));
于 2012-04-16T04:41:52.877 に答える