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