3

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

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.IntersectWithvs. IEnumerable.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.Intersect慢近 6 倍HashSet.IntersectWithToList是必需的,因为您想“制作仅包含重叠的第三个列表”

于 2012-09-06T19:09:47.827 回答
1

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

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