【发布时间】:2018-01-26 11:47:41
【问题描述】:
我想知道为什么 VB.Net 不能 GroupBy 匿名类型,而 C# 可以。
我在我的 C# 应用程序中做了一堆GroupBys,我通常形成匿名类型,以确保代码的可读性。
现在我在 VB.Net 中做到了。 ruslt:它不起作用。
有人可以解释这种行为吗?
C#-代码:
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);
}
}
VB.Net-代码:
Public Class TestObjekt
Public Property Ean() As Int32
Public Property Size() As Int32
Public Property Amount() As Int32
End Class
Sub Main()
Dim objekts As New List(Of TestObjekt)
objekts.Add(New TestObjekt() With {.Amount = 10, .Ean = 1, .Size = 2})
objekts.Add(New TestObjekt() With {.Amount = 100, .Ean = 1, .Size = 2})
Dim query = objekts.GroupBy(
Function(g) New With
{
.Ean = g.Ean,
.Size = g.Size
},
Function(key, group) New TestObjekt() With
{
.Ean = key.Ean,
.Size = key.Size,
.Amount = group.Sum(Function(s) s.Amount)
}).ToList()
'We still got two objects here.
For Each q As TestObjekt In query
Console.WriteLine("Ean: {0}, Size: {1}, Amount: {2}", q.Ean, q.Size, q.Amount)
Next
query = objekts.GroupBy(
Function(g) g.Ean.ToString() + "@" + g.Size.ToString(),
Function(key, group) New TestObjekt() With
{
.Ean = group.First().Ean,
.Size = group.First().Size,
.Amount = group.Sum(Function(s) s.Amount)
}).ToList()
'This is working. We Only have one object.
For Each q As TestObjekt In query
Console.WriteLine("Ean: {0}, Size: {1}, Amount: {2}", q.Ean, q.Size, q.Amount)
Next
End Sub
【问题讨论】:
-
我认为写 FOR 循环是错误的,而不是 GroupBy()。 GroupBy 给出一个二维数组 Group[][]。第一个数组是组,第二个数组是组中的项目。你是一个从每个组中写一个项目而不是所有项目的人。
-
ToList on an Grouping 返回值列表。正如您在 vb 代码中的第二个 for 循环中看到的那样,它工作正常。
-
不,它没有按照您想要的方式工作。您需要嵌套两个 for 循环才能获得所有结果。
-
不。 IEnumerable
.GroupBy() 返回一个 IEnumerable >。它是“键值对”的“列表”。没有第二个维度。 -
是的。组中的每个键都可以有一个或多个项目。如果你只有一只母鸡,为什么要使用 Sum()?
标签: c# vb.net anonymous-types