我正在使用 Visual C# 2010 Express。我有 2 个邮政编码列表,每个列表本身不包含重复项(列表项都是不同的)。但是,在比较 2 个列表时存在一些重叠,我想制作第三个列表,其中仅包含重叠。有没有我可以使用的方法来做到这一点?
问问题
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
vs. 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.IntersectWith
。ToList
是必需的,因为您想“制作仅包含重叠的第三个列表”。
于 2012-09-06T19:09:47.827 回答
1
假设邮政编码只是string
s(或int
s),您可以使用 Linq 的Intersect
方法获得重叠:
List<string> overlap = zips1.Intersect(zips2).ToList();
于 2012-09-06T19:05:07.410 回答