LINQ语句中匿名类型的等效VB.NET语法是什么?

Ben*_*ack 21 .net c# linq vb.net anonymous-types

我正在尝试将一些C#LINQ代码翻译成VB.NET,并且我仍然坚持如何在VB.NET中声明一个匿名类型.

.Select(ci => 
    new { CartItem = ci, 
          Discount = DiscountItems.FirstOrDefault(di => di.SKU == ci.SKU) }) 
Run Code Online (Sandbox Code Playgroud)

你如何将C#的new { ... }语法翻译成VB.NET?

Jus*_*ner 35

new { ... }

New With { ... } 在VB.NET中,

要么

New With {Key ... } 如果要使用Key属性(允许您比较两个匿名类型实例但不允许更改这些属性的值).

所以我猜你的陈述会是这样的:

.Select(Function(ci) New With {Key _
    .CartItem = ci, _
    .Discount = DiscountItems.FirstOrDefault(Function(di) di.SKU = ci.SKU) _
})
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!在C#中定期工作时,尝试在VB中编写如此简单的东西是非常困难的. (3认同)

Gui*_*cha 13

C#:

new {name1 = "value1", name2 = "value2"}
Run Code Online (Sandbox Code Playgroud)

VB等价物:

New With {Key .name1 = "value1", Key .name2 = "value2"}
Run Code Online (Sandbox Code Playgroud)

也,

C#:

new {anotherObj.prop1, anotherObj.prop2}
Run Code Online (Sandbox Code Playgroud)

VB等价物:

New With {Key anotherObj.prop1, Key anotherObj.prop2}
Run Code Online (Sandbox Code Playgroud)

注意:VB等价物中的Key关键字是必需的.当您在VB中指定Key时,该属性变为只读并在Equal方法中进行检查.在C#中,匿名类型的所有属性都是只读的,并在Equal方法中检查.

看到:

匿名类型(C#编程指南)

匿名类型(Visual Basic)

  • 如果您想要与 C# 完全相同的行为,则确实需要“Key”关键字。澄清一下,VB 为您提供了 C# 所不提供的匿名类型的一些灵活性。您前面没有添加“Key”的任何字段都是可读写的,而不是只读的,并且被排除在相等比较之外,这可能正是您想要的。 (3认同)