3

Visual C# 2010 Express を使用しています。郵便番号の 2 つのリストがあり、それぞれに重複が含まれていません (リスト項目はすべて異なります)。ただし、2 つのリストを比較すると重複する部分があり、重複部分のみを含む 3 つ目のリストを作成したいと考えています。これを行うために使用できる方法はありますか?

4

3 に答える 3

12

使用できますEnumerable.Intersect

var duplicates = list1.Intersect(list2);
于 2012-09-06T19:04:47.370 に答える
4

いずれにせよそれらが異なる場合は、を使用することもできますHashSet<T>

IntersectWithたとえば、次のようなメソッドがあります。

HashSet<String> set1 = new HashSet<String>(list1);
HashSet<String> set2 = new HashSet<String>(list2);
set1.IntersectWith(set2);

MSDN:

現在の HashSet オブジェクトを変更して、そのオブジェクトと指定されたコレクションに存在する要素のみを含めます。

簡単な測定 (HashSet.IntersectWithIEnumerable.Intersect).

var list1 = new List<String>();
for (int i = 0; i < 1000000; i++)
    list1.Add("Item" + i);
var list2 = new List<String>();
for (int i = 500000; i < 5000000; i++)
    list2.Add("Item" + i);

var watch1 = new System.Diagnostics.Stopwatch();
HashSet<String> set1 = new HashSet<String>(list1);
HashSet<String> set2 = new HashSet<String>(list2);
watch1.Start();
set1.IntersectWith(set2);
watch1.Stop();

var watch2 = new System.Diagnostics.Stopwatch();
watch2.Start();
List<String> intersectingList = list1.Intersect(list2).ToList();
watch2.Stop();

var hashSetTime = watch1.Elapsed.ToString();  // 0.27 seconds
var listTime = watch2.Elapsed.ToString();  // 1.46 seconds

よりEnumerable.Intersectもほぼ 6 倍遅いですHashSet.IntersectWith「オーバーラップのみを含む 3 番目のリストを作成する」ため、ToList必須です。

于 2012-09-06T19:09:47.827 に答える
1

郵便番号が単なるstrings (またはs) であると仮定すると、Linq の方法intを使用して重複を取得できます。Intersect

 List<string> overlap = zips1.Intersect(zips2).ToList();
于 2012-09-06T19:05:07.410 に答える