【问题标题】:VB.net Iterate Anonymous Type Collection With Lambda ExpressionVB.net 使用 Lambda 表达式迭代匿名类型集合
【发布时间】:2021-08-05 00:01:12
【问题描述】:

我试图遍历一个匿名类型集合但得到一个 System.MissingMemberException H结果=0x80131512 消息=重载解析失败,因为没有可访问的“ForEach”接受此数量的参数。 并且无法确定原因。我成功使用 For Each 但无法使用 Lambda 表达式。

        Dim car As Object = {(New With {Key .Model = "Buick", .Color = "Blue"}),
    (New With {Key .Model = "Volvo", .Color = "Green"}),
    (New With {Key .Model = "Jeep", .Color = "Red"})}

    For Each item In car
        If item.Color = "Blue" Then Debug.Print(String.Format("{0} {1}", item.Model, item.Color))
    Next

    car.ForEach(Sub(x)
                    Debug.Print(String.Format("[0} {1}", x.model, x.color))
                End Sub)

【问题讨论】:

    标签: vb.net lambda


    【解决方案1】:

    感谢您为我指出正确的方向,这是我正在寻找的工作示例。

    Imports System
    Imports System.Linq
    
    Public Module Module1
        
        Public Sub Main()
            
            Dim cars = ({ New With { .Model = "Buick", .Color = "Blue"},
            New With { .Model = "Volvo", .Color = "Green"},
            New With { .Model = "Jeep", .Color = "Red"}
        })
    
            cars.AsEnumerable.ToList().ForEach(sub(x) 
                    console.WriteLine(string.format("Model: {0}  Color: {1}", x.Model, x.Color ))
                End Sub)
        End Sub
    End Module
    

    【讨论】:

    • 这里有什么意义?如果你想要一个通用的List,为什么不首先创建一个通用的List?如果你已经有一个数组,为什么你要从它创建一个通用的List 只是为了使用ForEach 方法,而你可以使用For Each 循环来实现同样的事情?似乎您将 LINQ 视为一种闪亮的新玩具,您想在任何地方使用它,即使这样做毫无意义。
    • 另外,在这种情况下调用AsEnumerable 有什么意义?调用该方法的唯一原因是获取IEnumerable(Of T) 类型的引用,以便消除方法调用的歧义。您需要隐藏的数组上没有其他可用的 ToList 方法,因此调用 AsEnumerable 毫无意义。
    • 这和我写的代码完全一样,除了 ToList'ing 在几纳秒后完成/cars 仍然是一个数组
    • 有一些优点是应该避免 ForEach 而不是 For Each 尤其是由于 VB 的 lambda 语法有点笨拙。我个人觉得 For Each 更容易阅读
    • 顺便说一句,如果您想尝试新事物,插值字符串可能会稍微整理一下代码Debug.Print($"The car is {item.Model} in color {item.Color} and costing {item.Price:0,000.00} in the sale finishing {DateTime.Today.AddDays(1):yyyy-MM-dd}"),作为如何使用它们以及如何格式化数字/日期的快速演示等(您将传递给 ToString 的任何内容都在冒号之后)
    【解决方案2】:

    ForEach 是 List(Of T) 事物,而不是 LINQ 事物..

        Dim cars = ({ New With {Key .Model = "Buick", .Color = "Blue"},
            New With {Key .Model = "Volvo", .Color = "Green"},
            New With {Key .Model = "Jeep", .Color = "Red"}
        }).ToList()
    

    这会将汽车创建为一个匿名数组,然后使用 ToList 从中创建一个列表; ForEach 然后就可以使用了

    注意:集合使用复数

    【讨论】:

    • 不起作用..“ToList”不是“System.Array”的成员。
    • @Malcolm,.NET Framework 4.8 的文档为 here,.NET 5.0 的文档为 here。与往常一样,您需要引用适当的程序集并导入适当的命名空间才能使用它。
    • 你忘了Imports System.Linq - 数组是可枚举的,而 ToList 是可枚举的 linq 扩展
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多