代码之家  ›  专栏  ›  技术社区  ›  smoothdeveloper

如何使用vb.net linq to对象通过匿名类型分组

  •  1
  • smoothdeveloper  · 技术社区  · 15 年前

    我正在尝试在vb.net中编写一个linq-to-object查询,这里是我正在尝试实现的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;
    }
    

    我很难使用不相同的分组语法(vb在某些地方需要'identifier=expression',以及带有'expression required'的求和函数)

    非常感谢你的帮助!

    1 回复  |  直到 15 年前
        1
  •  5
  •   John Wigger    15 年前

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