Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GroupBy匿名类型不';不行。在C#it';他在工作_C#_Vb.net_Anonymous Types - Fatal编程技术网

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);
    }
}