将 C# LINQ 查询转换为 VB

问题描述 投票:0回答: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()
。它似乎正在定义一些标签(或者可能是某种临时结构),它可以传递到下一个
.Where()
子句。我尝试定义一个函数,在其中声明一些具有这些名称的变量,但我不知道如何声明它们:

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

类型应该是正确的(两个

Integer
),但显然尝试创建一个
Dictionary(Of Integer, Integer)
并不能让我进入下一个
.Where()
或带有“名称”的
.OrderBy()
子句“/用于
user
builtin
传播的标签。

我是否需要创建/声明一个

Private Structure
或类中可以在该查询中使用的内容?

c# vb.net linq translate
1个回答
0
投票

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

Dim members As MemberInfo() = type.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()
© www.soinside.com 2019 - 2024. All rights reserved.