C# C检查对象数组是否存在重复项

C# C检查对象数组是否存在重复项,c#,arrays,dictionary,no-duplicates,C#,Arrays,Dictionary,No Duplicates,我有一个Customer[]对象数组,我想用它创建一个字典。在加载字典之前,检查数组是否存在重复项的最简单方法是什么?我希望避免ArgumentException:已添加具有相同键的项。谢谢。在添加客户之前,只需调用Dictionary.ContainsKeykey。在添加客户之前,只需调用Dictionary.ContainsKeykey。您可以使用LINQ执行以下两项操作: Customer[] customers; // initialized somehow... var custome

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

在添加客户之前,只需调用Dictionary.ContainsKeykey。

在添加客户之前,只需调用Dictionary.ContainsKeykey。

您可以使用LINQ执行以下两项操作:

Customer[] customers; // initialized somehow...
var customerDictionary = customers.Distinct().ToDictionary( cust => cust.SomeKey );
如果要以不那么直接的方式构建字典,则可以使用Distinct extension方法获得一个唯一的数组,如下所示:

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 ); 
}

您可以使用LINQ同时执行以下两项操作:

Customer[] customers; // initialized somehow...
var customerDictionary = customers.Distinct().ToDictionary( cust => cust.SomeKey );
如果要以不那么直接的方式构建字典,则可以使用Distinct extension方法获得一个唯一的数组,如下所示:

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 ); 
}

阵列有多大?有多大可能会出现重复

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

在添加每个项目之前,调用Dictionary.ContainsKeykey会更快


注意:如果副本很少,则可以使用异常处理,但这是一种糟糕的编程实践。

阵列有多大?有多大可能会出现重复

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

在添加每个项目之前,调用Dictionary.ContainsKeykey会更快

注意:如果重复很少,那么您可以使用异常处理,但这是糟糕的编程实践。

为什么不这样做

Customers.Distinct.ToDictionary(o=>o, GenerateString(o));
为什么不是这个

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

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

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


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

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

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


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

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

dict[key] = value

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

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

dict[key] = value

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

我想提前知道是否通过了重复项,而不是在添加项时动态检查。我可以使用Dictionary.ContainsKey,但是我必须在数组中旋转两次,我想这并不可怕,我只是想知道是否有一种更简单的方法我不知道。谢谢。我想提前知道,在我添加项目时,是否通过了重复项,而不是动态检查。我可以使用Dictionary.ContainsKey,但是我必须在数组中旋转两次,我想这并不可怕,我只是想知道是否有一种更简单的方法我不知道。谢谢,小阵列。这是我的方向,但我想在我开始处理之前预先知道是否传递了重复数据。字典中的字符串是来自与Customer对象关联的web服务的某个响应XML。使用异常处理进行流控制不是一种可取的做法。将异常用于流程流是一种糟糕的做法!小型阵列。这是我的方向,但我想在我开始处理之前预先知道是否传递了重复数据。字典中的字符串是来自与Customer对象关联的web服务的某个响应XML。使用异常处理进行流控制不是一种可取的做法。将异常用于流程流是一种糟糕的做法!我喜欢这种方法的外观,在这种情况下我不愿意谈论性能,但在数组中调用distinct是否会涉及到大量的比较?Dictionary.ContainsKey相对来说是O1。@Josh:我的理解是LINQ的Distinct运算符int
Ernaly构建哈希集结构以优化其性能。因此,它的性能应该比在列表中迭代搜索重复项要好。阅读此问题了解更多信息:我喜欢这种方法的外观,在这种情况下我不愿意谈论性能,但在数组上调用distinct不需要进行大量比较吗?Dictionary.ContainsKey相对来说是O1。@Josh:我的理解是LINQ的Distinct操作符在内部构建了一个哈希集结构,以优化其性能。因此,它的性能应该比在列表中迭代搜索重复项要好。阅读此SO问题了解更多信息:假设两个客户对象具有相同的SSN,则它们是重复的。啊,在这种情况下,您需要指定相等性,因为指针的简单比较不会告诉您这一点。因此,您可以将SSD用作字典中的键,或者,为了获得更完整的解决方案,您可以实现一个IEqualityComparer,您可以在一系列linq扩展方法中使用它。假设两个客户对象具有相同的SSN,则它们是重复的。啊,在这种情况下,您需要指定相等性,因为指针的简单比较不会告诉您这一点。因此,您可以将SSD用作字典中的键,或者为了更完整的解决方案,您可以实现一个IEqualityComparer,您可以在一系列linq扩展方法中使用。+1因为他没有说每个对象的值都是唯一的。+1因为他没有说每个对象的值都是唯一的。