Visual C# 2010 Express を使用しています。郵便番号の 2 つのリストがあり、それぞれに重複が含まれていません (リスト項目はすべて異なります)。ただし、2 つのリストを比較すると重複する部分があり、重複部分のみを含む 3 つ目のリストを作成したいと考えています。これを行うために使用できる方法はありますか?
質問する
4083 次
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.IntersectWith
対IEnumerable.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
郵便番号が単なるstring
s (またはs) であると仮定すると、Linq の方法int
を使用して重複を取得できます。Intersect
List<string> overlap = zips1.Intersect(zips2).ToList();
于 2012-09-06T19:05:07.410 に答える