检查列表中是否已存在相同的对象

时间:2009-08-10 11:41:05

标签: c# list

以下是故事:

我试图列出不同的集群......我只想拥有必要的集群......集群可以是相同的。

如何通过检查列表是否包含对象(我知道对象不能在此传递)来将其添加到列表中

这是我的样本报价:

foreach (Cluster cluster in clustersByProgramme)
{
    if (!clusterList.Contains(cluster))
    {
        clusterList.Add(cluster);
    }
}

5 个答案:

答案 0 :(得分:8)

你的代码应该有用;如果没有,您可能正在使用代表相同实际集群的不同对象实例,并且您可能还没有提供合适的Equals实现(您还应该更新{{1在同一时间)。

另外 - 在.NET 3.5中,这可能只是:

GetHashCode

作为支持相等测试的类的示例:

var clusterList = clustersByProgramme.Distinct().ToList();

答案 1 :(得分:3)

你的例子就像它将要获得的一样简单。我唯一可能建议您使用Exists方法:

  

谓词是一个代表   如果对象返回true的方法   传递给它符合条件   在代表中定义。要素   当前列表是单独的   传递给Predicate代表, 和   匹配时停止处理   找到。

     

此方法执行线性搜索;   因此,这种方法是O(n)   操作,其中n是计数。

答案 2 :(得分:2)

如果您使用的是.NET 3.5,请使用HashSet执行此操作。

HashSet<Cluster> clusterList = new HashSet<Cluster>();
foreach (Cluster cluster in clustersByProgramme)
{
     clusterList.Add(cluster);
}

在这种情况下,还要确保如果cluster1 == cluster2,那么

cluster1.Equals(cluster2);
cluster2.Equals(cluster1); //yeah, could be different depending on your impl
cluster1.GetHashCode() == cluster2.GetHashCode();

答案 3 :(得分:0)

您的代码是正确的,但效率不高。您可以改为使用HashSet<T>,如下所示:

HashSet<Cluster> clusterSet = new HashSet<T>();
foreach (Cluster cluster in clustersByProgramme)
  clusterSet.Add(cluster);

在这种情况下,还要确保如果cluster1 == cluster2,那么

cluster1.Equals(cluster2);
cluster2.Equals(cluster1); //yeah, could be different depending on your impl
cluster1.GetHashCode() == cluster2.GetHashCode();

答案 4 :(得分:0)

为什么不使用字典?

只要您的商品具有良好的哈希值,它就是n(1)。

似乎是一个简单的解决方案

即词典。包含(键)是n(1)

然后您可以更新现有的if或添加新的