1

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

4

6 回答 6

6

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

于 2009-10-26T20:45:56.373 回答
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 ); 
}
于 2009-10-26T20:46:35.310 回答
2

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

对照所有其他元素检查数组中的每个元素是一项非常昂贵的操作。

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

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

于 2009-10-26T20:46:39.490 回答
2

从性能和代码的角度来看,最有效的方法是:

dict[key] = value

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

于 2009-10-26T20:53:20.070 回答
1

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

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

有时,虽然相等的概念并不那么简单,但具有相同数据的不同对象实例是否相等?在这种情况下,您可能需要一个 IEqualityComparer 的实现来帮助您。

于 2009-10-26T20:52:02.490 回答
0

为什么不是这个??

Customers.Distinct.ToDictionary(o=>o, GenerateString(o));
于 2009-10-26T20:47:36.870 回答