【问题标题】:how to group by over anonymous type with vb.net linq to object如何使用 vb.net linq 按匿名类型分组到对象
【发布时间】:2010-03-14 10:43:14
【问题描述】:

我正在尝试在 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;
}

我很难使用不一样的 group by 语法(vb 在某些地方需要 'identifier = expression',以及带有 'expression required' 的求和函子)

非常感谢您的帮助!

【问题讨论】:

    标签: vb.net linq c#-to-vb.net


    【解决方案1】:

    您可以在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多