开发者

How to get an object from a list based upon IEqualityComparer<T>

开发者 https://www.devze.com 2022-12-29 19:29 出处:网络
The Compare method in Linq lets you find by an IEqualityComparer, but I can\'t find a counterpart method that allows you retrieve an item by the same comparer.

The Compare method in Linq lets you find by an IEqualityComparer, but I can't find a counterpart method that allows you retrieve an item by the same comparer.

Is this really the best way to do it?

MyItem myFinderItem = new MyItem(keyField1, keyField2);
if (myList.Contains(myFinderItem, new MyE开发者_如何学编程qualityComparer()))
{
    MyItem myRealItem = myList.Single(item => new MyEqualityComparer().Equals(item , myFinderItem));
}

(I'm sharing the usage of the IEqualityComaprer with a call to the Except Linq method and I'd like to maintain a single source for equality comparisons)

Edit: What I'm looking for a method that has the signature:

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

Edit2: I guess this works, it's funky. but it's horrible and would never use it:(

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


First, you should use the same instance of MyEqualityComparer rather than creating a new instance every time (you should perhaps consider making it a singleton).

Other than that, I don't think there's a much better way of doing it. If you want to make it shorter and more readable, you could create an extension method that takes a IEquaityComparer<T> instead of a predicate :

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

精彩评论

暂无评论...
验证码 换一张
取 消