代码之家  ›  专栏  ›  技术社区  ›  Greg

如何基于iequalitycomparer从列表中获取对象<t>

  •  6
  • Greg  · 技术社区  · 15 年前

    linq中的compare方法允许您通过iequalitycomparer查找,但我找不到允许您通过同一个comparer检索项的对应方法。

    这真的是最好的方法吗?

    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)
    

    伊迪丝2:我想这行得通, 很恐怖 . 但这太可怕了,永远不会用它 :(

    myList.Intersect( new List<MyItem>{myFinderItem}, comparer).Single();
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Thomas Levesque    15 年前

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