有2个列表,你如何在C#中找到它们之间的重叠?

时间:2012-09-06 19:03:02

标签: c# visual-studio-2010

我正在使用Visual C#2010 Express。我有2个邮政编码列表,每个邮政编码都不包含重复项(列表项都是不同的)。但是,当比较2个列表时,存在一些重叠,我想制作仅包含重叠的第三个列表。有没有一种方法可以用来做到这一点?

3 个答案:

答案 0 :(得分:9)

您可以使用Enumerable.Intersect

var duplicates = list1.Intersect(list2);

答案 1 :(得分:3)

如果它们完全不同,您也可以使用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)。正如您所看到的,在此示例中,HashSet比列表方法快得多。

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.IntersectHashSet.IntersectWith慢近6倍。 ToList是必需的,因为您希望&#34;制作仅包含重叠的第三个列表&#34;

答案 2 :(得分:1)

假设邮政编码只是string s(或int s),您可以使用Linq的Intersect方法获得重叠:

 List<string> overlap = zips1.Intersect(zips2).ToList();