检查集合中的重复项

时间:2008-09-25 17:17:06

标签: c# .net .net-2.0

假设您有一组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的操作?

8 个答案:

答案 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()。