[c#] LINQ选择不同于匿名类型


Answers

public class DelegateComparer<T> : IEqualityComparer<T>
{
    private Func<T, T, bool> _equals;
    private Func<T, int> _hashCode;
    public DelegateComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
    {
        _equals= equals;
        _hashCode = hashCode;
    }
    public bool Equals(T x, T y)
    {
        return _equals(x, y);
    }

    public int GetHashCode(T obj)
    {
        if(_hashCode!=null)
            return _hashCode(obj);
        return obj.GetHashCode();
    }       
}

public static class Extensions
{
    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items, 
        Func<T, T, bool> equals, Func<T,int> hashCode)
    {
        return items.Distinct(new DelegateComparer<T>(equals, hashCode));    
    }
    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
        Func<T, T, bool> equals)
    {
        return items.Distinct(new DelegateComparer<T>(equals,null));
    }
}

var uniqueItems=students.Select(s=> new {FirstName=s.FirstName, LastName=s.LastName})
            .Distinct((a,b) => a.FirstName==b.FirstName, c => c.FirstName.GetHashCode()).ToList();

对不起,早些时候搞乱了格式化

Question

所以我有一个对象集合。 确切的类型并不重要。 从它我想提取一对特定属性的所有唯一对,因此:

myObjectCollection.Select(item=>new
                                {
                                     Alpha = item.propOne,
                                     Bravo = item.propTwo
                                }
                 ).Distinct();

所以我的问题是:Will Distinct在这种情况下使用默认对象equals(这对我来说是无用的,因为每个对象都是新的),或者可以告诉做一个不同的equals(在这种情况下,Alpha和Bravo的值相等=>等于实例)? 有没有办法实现这个结果,如果这不行的话?




我跑了一个小测试,发现如果属性是值类型,它似乎工作正常。 如果它们不是值类型,那么类型需要提供它自己的Equals和GetHashCode实现。 我想,弦乐会起作用。




如果AlphaBravo都从一个普通类继承,那么通过实现IEquatable<T> ,您将能够在父类中规定相等性检查。

例如:

public class CommonClass : IEquatable<CommonClass>
{
    // needed for Distinct()
    public override int GetHashCode() 
    {
        return base.GetHashCode();
    }

    public bool Equals(CommonClass other)
    {
        if (other == null) return false;
        return [equality test];
    }
}



Links