1

我读到,当从 LINQ to Objects 查询投影一个新的匿名对象时,投影的对象将覆盖其EqualsGetHashCode方法,以便执行任何进一步检查相等性的方法将正常工作。

这让我认为,实现一个自定义运算符来投射匿名版本的传入T可能有助于避免在我的某些类中覆盖这些方法或创建自定义 IComparers。

我想这样使用它:

var newList = list.SelectWithComparer(s => new { s }).Union(List2);

首先,这是个好主意吗?

其次,有可能吗?

我尝试了以下方法,但无法编译代码:

public static class LINQExtensions
{
    public static IEnumerable<T> SelectWithComparer<T>(this IEnumerable<T> source)
    {
        return source.Select(s => new { s });          
    }
} 

编译错误是由于 anynomous 类型不再是原始 T:

Error   5   Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<T>'. An explicit conversion exists (are you missing a cast?)    

有人可以帮忙吗?

谢谢

4

1 回答 1

3

匿名类型正确地覆盖Equals和方法,但这些方法的实现又GetHashCode依赖于为该对象定义的属性的类型实现的方法。EqualsGetHashCode

因此,例如,如果您定义这样的对象:

var anonym = new {A = 42, B = "XYZ"};

这个匿名对象的Equalsand的实现将调用type (因为 property是 type )和 type (因为 property是type )的 and 。GetHashCodeEqualsGetHashCodeintAintstringBstring

话虽这么说,你想要实现的基本上是没用的。事实上,如果你定义了一个匿名类型,它的属性设置为对象,s例如:

var myAnonym = new { s };

正确地作为字典/哈希表中的键工作,GetHashCode并且必须正确定义Equals对象的方法。 但如果是的话,将对象包装在匿名类中的意义何在?您已经可以在字典中使用它:-)s

于 2013-06-13T09:08:14.233 回答