以下是故事:
我试图列出不同的集群......我只想拥有必要的集群......集群可以是相同的。
如何通过检查列表是否包含对象(我知道对象不能在此传递)来将其添加到列表中
这是我的样本报价:
foreach (Cluster cluster in clustersByProgramme)
{
if (!clusterList.Contains(cluster))
{
clusterList.Add(cluster);
}
}
答案 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或添加新的