首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查对象是否已存在于列表中

如何检查对象是否已存在于列表中
EN

Stack Overflow用户
提问于 2010-08-09 00:28:02
回答 8查看 418.8K关注 0票数 132

我有一个清单

代码语言:javascript
复制
  List<MyObject> myList

我正在向列表中添加项目,我想检查该对象是否已经在列表中。

所以在我这么做之前:

代码语言:javascript
复制
 myList.Add(nextObject);

我想看看nextObject是否已经在列表中了。

对象"MyObject“有许多属性,但比较是基于两个属性的匹配。

在这个"MyObject“列表中添加一个新的”MyObject“之前,最好的检查方法是什么?

我想出的唯一解决方案是将列表更改为字典,然后将键设置为属性的连接字符串(这看起来有点不雅致)。

有没有其他更干净的解决方案使用list或LINQ或其他东西?

EN

回答 8

Stack Overflow用户

发布于 2014-12-22 03:41:03

只需使用Contains方法即可。请注意,它是基于相等函数Equals工作的

代码语言:javascript
复制
bool alreadyExist = list.Contains(item);
票数 104
EN

Stack Overflow用户

发布于 2010-08-09 00:32:26

如果使用这两个属性是可维护的,那么您可以:

代码语言:javascript
复制
bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");
票数 64
EN

Stack Overflow用户

发布于 2010-08-09 00:48:02

你确定在这种情况下需要列表吗?如果使用许多项填充列表,则myList.ContainsmyList.Any的性能将受到影响;运行时将是二次的。您可能希望考虑使用更好的数据结构。例如,

代码语言:javascript
复制
 public class MyClass
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }

    }

    public class MyClassComparer : EqualityComparer<MyClass>
    {
        public override bool Equals(MyClass x, MyClass y)
        {
            if(x == null || y == null)
               return x == y;

            return x.Property1 == y.Property1 && x.Property2 == y.Property2;
        }

        public override int GetHashCode(MyClass obj)
        {
            return obj == null ? 0 : (obj.Property1.GetHashCode() ^ obj.Property2.GetHashCode());
        }
    }

您可以通过以下方式使用HashSet:

代码语言:javascript
复制
  var set = new HashSet<MyClass>(new MyClassComparer());
  foreach(var myClass in ...)
     set.Add(myClass);

当然,如果MyClass的这种相等定义是“通用的”,那么您不需要编写IEqualityComparer实现;您只需在类本身中覆盖GetHashCodeEquals即可。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3435089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档