如何通过匿名类型与vb.net linq对象进行分组

smo*_*per 1 linq vb.net c#-to-vb.net

我正在尝试在vb.net中编写一个linq到对象查询,这是我正在尝试实现的c#版本(我在linqpad中运行它):

void Main()
{
 var items = GetArray(
        new {a="a",b="a",c=1}
        , new {a="a",b="a",c=2}
        , new {a="a",b="b",c=1}
    );

 (
  from i in items 
  group i by new {i.a, i.b} into g
  let p = new{ k = g, v = g.Sum((i)=>i.c)}
  where p.v > 1
  select p
 ).Dump();
}
// because vb.net doesn't support anonymous type array initializer, it will ease the translation
T[] GetArray<T>(params T[] values){
  return values;
}
Run Code Online (Sandbox Code Playgroud)

我很难使用不同的语法组(vb在某些地方需要'identifier = expression',以及带''表达式'的求和算子')

非常感谢你的帮助!

Joh*_*ger 5

您可以在VB.NET中创建一个Object类型的数组,该数组可以包含任何类型的对象,包括匿名类型.如果您保持相同的字段名称,类型和字段顺序,编译器将正确地推断出要使用相同的匿名类型.我在LinqPad中运行此代码以获得您正在查找的结果

 Dim items As Object() = { _
               New With {.a="a",.b="a",.c=1}, _
               New With {.a="a",.b="a",.c=2}, _
               New With {.a="a",.b="b",.c=1} _
            }
    Dim myQuery = From i In items _
             Group By i.a, i.b into g  = Group _
             let p = New With { .k = g, .v = g.Sum(Function(i) i.c)} _
          where p.v > 1 _
          select p
myQuery.Dump
Run Code Online (Sandbox Code Playgroud)