日期:2014-05-17  浏览次数:20947 次

关于IEqualityComparer<T>,有没有简便的写法
.net提供了Func<>之类的简便写法,想问下这个有没有类似的。。。

问题是这样:我在用linq的groupby的时候,需要用临时确定的方式判断对象是否相等,于是想用带IEqualityComparer参数的groupby的重载
                wc.Procedures.GroupBy(procedure => procedure, selector);

但selector无法直接传递表达式或匿名函数,只能是类,只能每遇到一次就定义一个类。。。于是我只好又定义了一个类selector

        class selector<T> : IEqualityComparer<T>
        {
            Func<T, T, bool> pred;

            public selector(Func<T, T, bool> pred)
            {
                this.pred = pred;
            }

            public bool Equals(T x, T y)
            {
                throw new NotImplementedException();
            }

            public int GetHashCode(T obj)
            {
                return obj.GetHashCode();
            }
        }

然后把new一个这个类把Func<T, T, bool>传进去,最后还要把new出来的对象传进groupby
问题是解决了,但感觉有点丑,所以想问下正常的写法是怎么样的。。。

------解决方案--------------------
正常写法就应该是定义一个类,说的好听点叫做定义一个比较器。
可以说,这是.net 1.X 2.0 阶段比较喜欢的方式。只是现在的lamda表达式和泛型委托用的比较舒畅,所以感觉到之前的做法有点繁琐而已。
这个没有办法...
------解决方案--------------------
引用:
我在用linq的groupby的时候,需要用临时确定的方式判断对象是否相等,于是想用带IEqualityComparer参数的groupby的重载
                wc.Procedures.GroupBy(procedure => procedure, selector);

这是哪里杀出来的李鬼呢?你是从哪里开始“想”的?
------解决方案--------------------
直接构建查询表达式
用MemberAccessExpression代替selector