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

将C#LINQ查询转换为VB[重复]

  •  0
  • G_Hosa_Phat  · 技术社区  · 1 年前

    我正在尝试将一些代码从C#转换为VB.NET,这些代码正在寻找一组特定的类成员,除了一个使用了一些我不熟悉的C#语法的LINQ查询外,我几乎已经完全解决了:

    var members = entityType.GetTypeInfo().GetMembers(bindingFlags)
        .Where(m => m.MemberType == MemberTypes.Property || m.MemberType == MemberTypes.Field)
        .Select((m, i) => (member: m, positions: (user: resolver.GetPosition(m), builtin: i)))
        .Where(x => x.positions.user != -1)
        .OrderBy(x => x.positions)
        .Select(x => x.member)
        .ToArray();
    

    第一个 .Where() 位有意义并转换为:

    .Where(Function(m) m.MemberType = MemberTypes.Property Or m.MemberType = MemberTypes.Field)
    

    但是,这是第一次 .Select() 我不明白的部分。它似乎在定义一些标签(或者可能是某种临时结构),可以传递给下一个 哪里 条款我试图定义一个函数,用这些名称声明一些变量,但我不知道如何声明它们:

    .Select(Function(m, i)
                Dim member = m
                Dim positions As New Dictionary(Of Integer, Integer)(Resolver.GetPosition(m), i)
            End Function)
    

    类型应正确(两者 Integer s) ,但显然只是试图创建 Dictionary(Of Integer, Integer) 不能让我进入下一个 哪里 或者 .OrderBy() 带有“名称”/标签的子句 user builtin 推进。

    我是否需要创建/声明 Private Structure 或者类中我可以在该查询中使用的东西?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Tim Schmelter    1 年前

    初始化命名元组的语法在VB.NET中略有不同:

    Dim members As MemberInfo() = entityType.GetTypeInfo().GetMembers(bindingFlags).
        Where(Function(m) m.MemberType = MemberTypes.Property OrElse m.MemberType = MemberTypes.Field).
        Select(Function(m, i) (member:=m, positions:=(user:=resolver.GetPosition(m), builtin:=i))).
        Where(Function(x) x.positions.user <> -1).
        OrderBy(Function(x) x.positions).
        Select(Function(x) x.member).
        ToArray()