.net 检查集合中的重复项

lo8azlld  于 2022-12-01  发布在  .NET
关注(0)|答案(9)|浏览(297)

假设您有一个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工作?

v1l68za4

v1l68za41#

fooList.Exists(item => item.Bar == SomeBar)

这不是LINQ,而是一个Lambda表达式,不过它使用了v3.5的特性。

fooList.Exists(delegate(Foo Item) { return item.Bar == SomeBar});

这在2.0版中应该能用。

zf2sa74q

zf2sa74q2#

实作IEqualityComparer界面,并使用相符的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())) {
    ...
}
55ooxyrt

55ooxyrt3#

如果需要该元素,还可以使用List.Find()并传入一个委托,该委托为定义的“匹配”(http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx)返回true。
在MSDN文档中有一个如何定义委托的示例。

eni9jsuy

eni9jsuy4#

存在(item =〉item.Bar ==某个条)
或使用匿名委托
fooList.Exists(委托(Foo项){返回项.栏== SomeBar;})

1yjd4xko

1yjd4xko5#

如果您覆写Foo上的Equals以使Key位于Bar上,Contains()将会运作。

bvjveswy

bvjveswy6#

如果类的'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;
iszxjhcz

iszxjhcz7#

如果可以使用LINQ,则可以执行以下操作:

bool contains = foolist.Where(f => f.Bar == someBar).Count() != 0;
iyfjxgzm

iyfjxgzm8#

以下是检查集合是否没有重复项的4种方法:

public static bool LinqAll<T>(IEnumerable<T> enumerable)
{
    HashSet<T> set = new();

    return !enumerable.All(set.Add);
}

public static bool LinqAny<T>(IEnumerable<T> enumerable)
{
    HashSet<T> set = new();

    return enumerable.Any(element => !set.Add(element));
}

public static bool LinqDistinct<T>(IEnumerable<T> enumerable)
{
    return enumerable.Distinct().Count() != enumerable.Count();
}

public static bool ToHashSet<T>(IEnumerable<T> enumerable)
{
    return enumerable.ToHashSet().Count != enumerable.Count();
}
jm81lzqq

jm81lzqq9#

您可能希望使用C5.HashSet,并为Foo实现Equals和GetHashCode()。

相关问题