【问题标题】:How to convert this code to LINQ?如何将此代码转换为 LINQ?
【发布时间】:2010-10-09 01:14:00
【问题描述】:

我正在尝试将其写为 LINQ,

原始代码:

For Each CurrentForm As Form In MyForms
    AddLink(CurrentForm.GetLink())
Next

我是一个 LINQ 初学者,到目前为止,我不太确定在哪里使用和在哪里不使用。如果在这种情况下 LINQ 会造成更大的伤害而不是帮助,请随意抨击我。

编辑:您可以假设 AddLink() 有一个重载,它采用 IEnumerable

【问题讨论】:

    标签: vb.net linq legacy


    【解决方案1】:

    除非存在采用集合的 AddLink 重载,否则 LINQ 不会避免循环。

    是否有这样的过载然后是这样的:

    AddLinks(MyForms.Select(f => f.GetLink())
    

    会做的。


    上述表达式的工作原理(简要):

    • LINQ 是关于表达式,获取一些对象(对于此处使用的 LINQ to Objects,始终是一个集合)
    • Select 扩展方法接受一个集合和一个函数并返回一个集合。该函数被传递给输入集合的每个元素。然后 Select 返回由所有函数返回值组成的集合。
    • 我使用lambda expression 创建了一个匿名函数,该函数接受一个名为 f 的参数(其类型将由编译器确定)并返回表达式的值(现已更正)。
    • AddLinks 是 AddLink 的假定变体,它采用链接集合。

    有很多事情要做,这是 LINQ 的优点之一,它是一种表达数据操作的紧凑方式,没有显式循环和临时变量的通常开销。

    【讨论】:

    • 我认为这是 C#(至少 VS 在 VB 中不喜欢它),我可以将任何普通的 C# 转换为 VB.NET,但无法从 LINQ 中获得任何意义C# 中的语句
    • 感谢您的更新,刚刚想到了 VB 的方法:AllLinks.AddRange(MyForms.Select(Function(xform) xform.GetAsLink(AttackResponse)))
    【解决方案2】:

    这里没有火焰,但 LINQ 在这里不会真正提供帮助。如果 LINQ 有一个 ForEach 方法(正如在 previous question 以及其他地方所讨论的那样),那么您可以使用它 - 但它不是 LINQ 内置的,在这种情况下似乎并没有太多使用它。

    当然,这完全取决于AddLink 的作用——如果它向列表添加链接,而您可以使用(比如)List.AddRange,那么您可以使用 LINQ。但是这段代码看起来已经很简单易读了,所以在这种情况下我不会担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多