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

时间:2010-05-07 20:47:58

标签: 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));
}

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

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

T Find<T>(T t, IEqualityComparer<T> comparer)

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

myList.Intersect( new List<MyItem>{myFinderItem}, comparer).Single();

1 个答案:

答案 0 :(得分:6)

首先,您应该使用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));
}