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