Pass a lambda expression in place of IComparer or IEqualityComparer or any single-method interface?

后端 未结 8 1936
闹比i
闹比i 2020-12-08 08:57

I happened to have seen some code where this guy passed a lambda expression to a ArrayList.Sort(IComparer here) or a IEnumerable.SequenceEqual(IEnumerable list, IEqualityCom

8条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-08 09:31

    public class Comparer2 : IComparer, IEqualityComparer
    {
        private readonly Expression> _KeyExpr;
        private readonly Func _CompiledFunc
        // Constructor
        public Comparer2(Expression> getKey)
        {
            _KeyExpr = getKey;
            _CompiledFunc = _KeyExpr.Compile();
        } 
    
        public int Compare(T obj1, T obj2)
        {
            return Comparer.Default.Compare(_CompiledFunc(obj1), _CompiledFunc(obj2));
        }
    
        public bool Equals(T obj1, T obj2)
        { 
            return EqualityComparer.Default.Equals(_CompiledFunc(obj1), _CompiledFunc(obj2));
        }
    
        public int GetHashCode(T obj)
        {
             return EqualityComparer.Default.GetHashCode(_CompiledFunc(obj));
        }
    }
    

    use it like this

    ArrayList.Sort(new Comparer2(p => p.Name));
    

提交回复
热议问题