如何用vb.net linq to object通过匿名类型进行分组?[英] how to group by over anonymous type with vb.net linq to object

本文是小编为大家收集整理的关于如何用vb.net linq to object通过匿名类型进行分组?的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在尝试在 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 中创建一个 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

本文地址:https://www.itbaoku.cn/post/1557125.html

问题描述

I'm trying to write a linq to object query in vb.net, here is the c# version of what I'm trying to achieve (I'm running this in 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;
}

I'm having hard time with either the group by syntax which is not the same (vb require 'identifier = expression' at some places, as well as with the summing functor with 'expression required' )

Thanks so much for your help!

推荐答案

You can create an array of type Object in VB.NET that can contain objects of any type, including anonymous types. The compiler will correctly infer that the same anonymous type is to be used provided you keep the same field name, types, and order of fields. I ran this code in LinqPad to get the results you are looking

 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