假设您有一组Foo
类:
class Foo
{
public string Bar;
public string Baz;
}
List<Foo> foolist;
并且您想要检查此集合以查看其他条目是否具有匹配的Bar
。
bool isDuplicate = false;
foreach (Foo f in foolist)
{
if (f.Bar == SomeBar)
{
isDuplicate = true;
break;
}
}
Contains()
不起作用,因为它将类比较为整体。
有没有人有更好的方法来执行适用于.NET 2.0的操作?
答案 0 :(得分:10)
fooList.Exists(item => item.Bar == SomeBar)
这不是LINQ,而是Lambda表达式,但是,它使用了v3.5功能。没问题:
fooList.Exists(delegate(Foo Item) { return item.Bar == SomeBar});
这应该适用于2.0。
答案 1 :(得分:4)
实施IEqualityComparer<T>界面,并使用匹配的Contains方法。
public class MyFooComparer: IEqualityComparer<Foo> {
public bool Equals(Foo foo1, Foo foo2) {
return Equals(foo1.Bar, foo2.Bar);
}
public int GetHashCode(Foo foo) {
return foo.Bar.GetHashCode();
}
}
Foo exampleFoo = new Foo();
exampleFoo.Bar = "someBar";
if(myList.Contains(exampleFoo, new MyFooComparer())) {
...
}
答案 2 :(得分:0)
fooList.Exists(item =&gt; item.Bar == SomeBar)
或匿名代表
fooList.Exists(delegate(Foo item){return item.Bar == SomeBar;})
答案 3 :(得分:0)
如果您需要该元素,您还可以使用List.Find()并传入一个委托,该委托对您的“匹配”(http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx)的定义返回true。
有一个如何在该MSDN文档上定义委托的示例。
答案 4 :(得分:0)
如果您的类的'Bar'是唯一的(类Foo的键),那么您可以尝试实现System.Collections.ObjectModel.KeyedCollection。这很简单:只需实现GetKeyForItem()方法。
class Foo
{
public string Bar;
public string Baz;
}
class FooList : KeyedCollection<string, Foo>
{
protected override string GetKeyForItem(Foo item)
{
return item.Bar;
}
}
FooList fooList;
答案 5 :(得分:0)
如果您在Foo上覆盖Equals以在Bar上生成键,则Contains()将起作用。
答案 6 :(得分:0)
如果您可以使用LINQ,您可以执行以下操作:
bool contains = foolist.Where(f => f.Bar == someBar).Count() != 0;
答案 7 :(得分:-1)
您可能想要使用C5.HashSet,并为Foo实现Equals和GetHashCode()。