我当然希望这不是一个重复的问题,但如果还有其他问题,我肯定找不到。
我有一个客户端,可以在自定义类中存储大量数据。为了这个问题,我们可以打电话给“网站”这个班级。
每个“站点”都有许多属性,但关键属性是Type(字符串2-3个字符长),“Index”是一个整数。每个站点由其类型和索引标识。单独的索引并非每个站点都是唯一的。
有时我需要快速找到Site对象的2个Arrays(Generic List)之间的差异。例如,我可能需要提取阵列1中但不在阵列2中的所有项目。
我们现在这样做的方法是使用多个Foreach循环......一旦网站数量超过5000,问题就是它的速度非常慢......我们需要确保它的效率高达100,000个站点。 / p>
有人可以在这方面给我一个正确的方向吗?我正在寻找的是一种快速获取阵列1但不是阵列2的站点列表的方法,反之亦然。很简单,但它的速度有问题:)
提前致谢,
戴夫
答案 0 :(得分:0)
如果我理解正确,你可以使用Linq。
string[] uniqueSites = sites1.Union(sites2).Distinct().ToArray();
这将为您提供2个数组之间的唯一值,并避免重复。
答案 1 :(得分:0)
这样做的一种方法是使用哈希集:创建一个哈希集"网站密钥" - 对{type, index}
,遍历第一个列表中的站点,将键添加到哈希集,然后浏览第二个列表,并通过检查哈希集中是否存在相应的键来确定成员资格。 / p>
这是一个骨架实现:
IList<Site> listA = ...
IList<Site> listB = ...
var keysA = new HashSet<Tuple<string,int>>(
listA.Select(site => Tuple.Create(site.Type, site.Index))
);
foreach (var site in listB) {
var keyB = Tuple.Create(site.Type, site.Index);
if (keysA.Contains(keyB)) {
// site is in both lists
} else {
// site is in listB but not listA
}
}
我使用内置类型Tuple<T1,T2>
来表示&#34;网站密钥&#34; - 成对string
和int
,其中string
是网站的类型,int
是网站的索引。您可以使用自己的类型,甚至可以使用Site
/ GetHashCode
的适当覆盖或Equals
的实施来使用IEqualityComparer<Site>
本身。
答案 2 :(得分:0)
有时我需要快速找到Site对象的2个Arrays(Generic List)之间的差异。例如,我可能需要提取阵列1中但不在阵列2中的所有项目。
您可以使用LINQ。要测试Type和Index,您需要覆盖GetHashCode / Equals,或者创建自定义相等比较器。一块蛋糕。
IEqualityComparer<T> comparer = ...;
var values = array1.Except(array2, comparer);