我正在使用Visual C#2010 Express。我有2个邮政编码列表,每个邮政编码都不包含重复项(列表项都是不同的)。但是,当比较2个列表时,存在一些重叠,我想制作仅包含重叠的第三个列表。有没有一种方法可以用来做到这一点?
答案 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.IntersectWith
与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
比HashSet.IntersectWith
慢近6倍。 ToList
是必需的,因为您希望&#34;制作仅包含重叠的第三个列表&#34; 。
答案 2 :(得分:1)
假设邮政编码只是string
s(或int
s),您可以使用Linq的Intersect
方法获得重叠:
List<string> overlap = zips1.Intersect(zips2).ToList();