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