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

时间:2010-02-25 18:12:51

标签: vb.net linq 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;
}

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分: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