GroupBy匿名类型不';不行。在C#it';他在工作
我想知道为什么GroupBy匿名类型不';不行。在C#it';他在工作,c#,vb.net,anonymous-types,C#,Vb.net,Anonymous Types,我想知道为什么VB.Net不能GroupBy一个匿名类型,但是C可以 在我的C#应用程序中,我做了大量的groupby,我通常会形成匿名类型,以确保代码的可读性 现在我在VB.Net中完成了。俄罗斯特:它不起作用 有人能解释一下这种行为吗 C#-代码: 老实说,我对它在C#中起作用感到惊讶,而不是对它在VB.NET中不起作用感到惊讶 这里的关键是编译器生成的类是否以及在多大程度上实现了Equals和GetHashCode。我想,这在很大程度上取决于编译器,但也取决于您所针对的.NET frame
VB.Net
不能GroupBy
一个匿名类型,但是C
可以
在我的C#应用程序中,我做了大量的groupby
,我通常会形成匿名类型,以确保代码的可读性
现在我在VB.Net中完成了。俄罗斯特:它不起作用
有人能解释一下这种行为吗
C#-代码:
老实说,我对它在C#中起作用感到惊讶,而不是对它在VB.NET中不起作用感到惊讶 这里的关键是编译器生成的类是否以及在多大程度上实现了
Equals
和GetHashCode
。我想,这在很大程度上取决于编译器,但也取决于您所针对的.NET framework版本。如果您的目标是一个包含新结构元组类型的框架版本,那么编译器可以使用它们(也就是说,我猜,C#应用程序中发生了什么)。否则,编译器必须创建旧的编译器生成的类(在VB.NET中显然发生了这种情况)。但是,也许VB.NET编译器中缺少对元组类型的支持,我只是不知道
导致这个问题的原因是结构元组在代数意义上实现了Equals和GetHashCode——两个元组被认为是相等的,当且仅当它们的元素相等时。旧的编译器生成的类型没有实现Equals或GetHashCode,因此,相同元素的两个元组被视为不同的。我认为write FOR循环是错误的,而不是GroupBy()。GroupBy提供了一个二维数组组[]。第一个数组是组,第二个数组是组中的项。您正在从每个组中写入一项而不是所有项。ToList on a Grouping返回值列表。正如您在vb代码的第二个for循环中看到的,它工作正常。不,它没有按您希望的方式工作。需要两个for循环嵌套才能获得所有结果。不。GroupBy()返回一个IEnumerable。它是“键值对”的“列表”。没有第二维度。是的,有。组中的每个键可以有一个或多个项。如果只有一个hen,为什么要使用Sum()?GetHashCode在C#和VB中的工作方式不同。VB=>仅键属性。C#=>所有字段。在S.Akbari和Patrick Hofman提出的问题中正确解释
public class TestObjekt
{
public int Ean { get; set; }
public int Size { get; set; }
public int Amount { get; set; }
}
public static void Main(params string[] args)
{
List<TestObjekt> objekts = new List<TestObjekt>()
{
new TestObjekt() {Ean = 1, Size = 2, Amount = 10},
new TestObjekt() {Ean = 1, Size = 2, Amount = 100}
};
var query = objekts.GroupBy(
g => new
{
Ean = g.Ean,
Size = g.Size
},
(key, group) => new TestObjekt()
{
Ean = key.Ean,
Size = key.Size,
Amount = group.Sum(s => s.Amount)
}).ToList();
// Wo got one object..
foreach (var q in query)
{
Console.WriteLine("Ean: {0}, Size: {1}, Amount: {2}", q.Ean, q.Size, q.Amount);
}
}