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

leo*_*ora 85 c# linq list

我有一份清单

  List<MyObject> myList
Run Code Online (Sandbox Code Playgroud)

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

所以在我这样做之前:

 myList.Add(nextObject);
Run Code Online (Sandbox Code Playgroud)

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

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

在我向"MyObject"列表中添加新的"MyObject"之前,检查的最佳方法是什么

我想到的唯一解决方案是从列表更改为字典,它们使键成为属性的连接字符串(这看起来有点不雅)

任何其他清洁解决方案使用列表或LINQ或其他?

Rex*_*x M 133

这取决于具体情况的需要.例如,假设字典方法非常好:

  1. 该列表相对稳定(没有很多插入/删除,字典没有优化)
  2. 列表非常大(否则字典的开销毫无意义).

如果上述情况不适合您的情况,请使用Any():

Item wonderIfItsPresent = ...
bool containsItem = myList.Any(item => item.UniqueProperty == wonderIfItsPresent.UniqueProperty);'
Run Code Online (Sandbox Code Playgroud)

这将枚举列表,直到找到匹配项,或直到它结束.


Ahm*_*mad 70

只需使用Contains方法即可.请注意,它基于相等功能工作Equals

bool alreadyExist = list.Contains(item);
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,它总是说不存在 (5认同)
  • @ Si8如果您正在尝试比较对象,则必须确保IEquatable <T> .Equals实现是针对您的对象类型正确实现的.否则,您将不会比较对象内容.有关如何实现此功能的示例,请参阅Ahmad指示的包含链接. (3认同)

p.c*_*ell 48

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

bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");
Run Code Online (Sandbox Code Playgroud)


Ani*_*Ani 7

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

 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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

  var set = new HashSet<MyClass>(new MyClassComparer());
  foreach(var myClass in ...)
     set.Add(myClass);
Run Code Online (Sandbox Code Playgroud)

当然,如果这种相等的定义MyClass是"普遍的",你就不需要编写IEqualityComparer实现; 你可以覆盖GetHashCodeEquals在类本身.


Fio*_*ite 5

另一点需要提到的是,您应该确保您的相等函数符合您的预期。您应该重写 equals 方法来设置对象的哪些属性必须匹配才能将两个实例视为相等。

然后你就可以做 mylist.contains(item)