我有一个清单
List<MyObject> myList
我正在向列表中添加项目,我想检查该对象是否已经在列表中。
所以在我这么做之前:
myList.Add(nextObject);
我想看看nextObject是否已经在列表中了。
对象"MyObject“有许多属性,但比较是基于两个属性的匹配。
在这个"MyObject“列表中添加一个新的”MyObject“之前,最好的检查方法是什么?
我想出的唯一解决方案是将列表更改为字典,然后将键设置为属性的连接字符串(这看起来有点不雅致)。
有没有其他更干净的解决方案使用list或LINQ或其他东西?
发布于 2014-12-22 03:41:03
只需使用Contains方法即可。请注意,它是基于相等函数Equals
工作的
bool alreadyExist = list.Contains(item);
发布于 2010-08-09 00:32:26
如果使用这两个属性是可维护的,那么您可以:
bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");
发布于 2010-08-09 00:48:02
你确定在这种情况下需要列表吗?如果使用许多项填充列表,则myList.Contains
或myList.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());
}
}
您可以通过以下方式使用HashSet:
var set = new HashSet<MyClass>(new MyClassComparer());
foreach(var myClass in ...)
set.Add(myClass);
当然,如果MyClass
的这种相等定义是“通用的”,那么您不需要编写IEqualityComparer
实现;您只需在类本身中覆盖GetHashCode
和Equals
即可。
https://stackoverflow.com/questions/3435089
复制相似问题