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));
}

(我与对Except Linq方法的调用共享了IEqualityComaprer的用法,并且我希望维护一个用于相等性比较的来源)

编辑:我正在寻找具有签名的方法:
T Find<T>(T t, IEqualityComparer<T> comparer)

Edit2:我想这行得通,很时髦。 ,但它太可怕了,永远不会使用它 :(
myList.Intersect( new List<MyItem>{myFinderItem}, comparer).Single();

最佳答案

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

除此之外,我认为没有更好的方法可以做到这一点。如果您想使其更短,更易读,则可以创建一个采用IEquaityComparer<T>而不是谓词的扩展方法:

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

关于c# - 如何从基于IEqualityComparer <T>的列表中获取对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2791586/

10-08 22:33
查看更多