我有一份清单
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
这取决于具体情况的需要.例如,假设字典方法非常好:
如果上述情况不适合您的情况,请使用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)
p.c*_*ell 48
如果可以维护使用这两个属性,您可以:
bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你确定需要一个列表吗?如果您使用许多项目填充列表,性能将受到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());
}
}
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实现; 你可以覆盖GetHashCode和Equals在类本身.
另一点需要提到的是,您应该确保您的相等函数符合您的预期。您应该重写 equals 方法来设置对象的哪些属性必须匹配才能将两个实例视为相等。
然后你就可以做 mylist.contains(item)
| 归档时间: |
|
| 查看次数: |
286094 次 |
| 最近记录: |