如何根据IEqualityComparer <T>从列表中获取对象

Gre*_*reg 8 c# linq

Linq中的Compare方法允许您通过IEqualityComparer查找,但我找不到允许您通过同一个比较器检索项目的对应方法.

这真的是最好的方法吗?

MyItem myFinderItem = new MyItem(keyField1, keyField2);
if (myList.Contains(myFinderItem, new MyEqualityComparer()))
{
    MyItem myRealItem = myList.Single(item => new MyEqualityComparer().Equals(item , myFinderItem));
}
Run Code Online (Sandbox Code Playgroud)

(我正在通过调用Except Linq方法分享IEqualityComaprer的用法,我想维护一个单一来源进行相等比较)

编辑:我正在寻找具有签名的方法:

T Find<T>(T t, IEqualityComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)

编辑2:我想这很有效,它很时髦.但它太可怕了,永远不会用它 :(

myList.Intersect( new List<MyItem>{myFinderItem}, comparer).Single();
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 7

首先,您应该使用相同的实例,MyEqualityComparer而不是每次都创建一个新实例(您可能应该考虑使其成为单例)。

除此之外,我认为没有比这更好的方法了。如果您想使其更短,更易读,则可以创建一个扩展方法,该方法采用a IEquaityComparer<T>代替谓词:

public static T Single<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer, T value)
{
    return source.Single(item => comparer.Equals(item, value));
}
Run Code Online (Sandbox Code Playgroud)