C#检查重复项的对象数组

时间:2009-10-26 20:43:23

标签: c# arrays dictionary no-duplicates

我有一个Customer []对象数组,我想用它来创建一个Dictionary< Customer,string>。在加载Dictionary之前,检查重复数组的最简单方法是什么?我想避免“ArgumentException:已经添加了具有相同键的项目”。感谢。

6 个答案:

答案 0 :(得分:6)

在添加客户之前,只需调用Dictionary.ContainsKey(密钥)。

答案 1 :(得分:5)

你可以使用LINQ来做到这两点:

Customer[] customers; // initialized somehow...
var customerDictionary = customers.Distinct().ToDictionary( cust => cust.SomeKey );

如果您将以不太直接的方式构建字典,您可以使用Distinct()扩展方法获取一个如此独特的数组:

Customer[] uniqueCustomers = customers.Distinct().ToArray();

如果您需要了解潜在的重复项,可以先使用GroupBy( c => c )来确定哪些项目有重复项。

最后,如果您不想使用LINQ,您可以动态构建字典并在添加每个项目时使用前置条件检查:

var customerDictionary = new Dictionary<Customer,string>();
foreach( var cust in customers )
{
    if( !customerDictionary.ContainsKey(cust) )
        customerDictionary.Add( cust, cust.SomeKey ); 
}

答案 2 :(得分:2)

阵列有多大?以及重复的可能性有多大?

检查阵列的每个元素与其他元素相比是非常昂贵的操作。

在添加每个项目之前调用Dictionary.ContainsKey(key)会更快。

注意:如果重复很少,那么您可以使用异常处理,但那是不好的编程习惯。

答案 3 :(得分:2)

从BOTH PERFORMANCE和CODE的观点来看,最有效的方法是:

dict[key] = value

这样,您提到的异常将永远不会被抛出,并且密钥查找不会发生两次

答案 4 :(得分:1)

在这种情况下,您对重复的定义是什么?

如果它只是相同的对象实例(相同的指针)那么这很简单,你可以使用这里给出的其他答案中的任何方法。

有时虽然平等概念不是那么直接,但 相同数据 的不同对象实例是否相同?在这种情况下,您可能希望实现IEqualityComparer来帮助您。

答案 5 :(得分:0)

为什么不呢?

Customers.Distinct.ToDictionary(o=>o, GenerateString(o));