C#快速比较和查找自定义类对象的数组/列表中的差异

时间:2014-07-17 15:35:37

标签: c# arrays

我当然希望这不是一个重复的问题,但如果还有其他问题,我肯定找不到。

我有一个客户端,可以在自定义类中存储大量数据。为了这个问题,我们可以打电话给“网站”这个班级。

每个“站点”都有许多属性,但关键属性是Type(字符串2-3个字符长),“Index”是一个整数。每个站点由其类型和索引标识。单独的索引并非每个站点都是唯一的。

有时我需要快速找到Site对象的2个Arrays(Generic List)之间的差异。例如,我可能需要提取阵列1中但不在阵列2中的所有项目。

我们现在这样做的方法是使用多个Foreach循环......一旦网站数量超过5000,问题就是它的速度非常慢......我们需要确保它的效率高达100,000个站点。 / p>

有人可以在这方面给我一个正确的方向吗?我正在寻找的是一种快速获取阵列1但不是阵列2的站点列表的方法,反之亦然。很简单,但它的速度有问题:)

提前致谢,

戴夫

3 个答案:

答案 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; - 成对stringint,其中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);