如何将此代码转换为LINQ?

时间:2009-02-21 13:45:43

标签: vb.net linq legacy

我正在尝试将其写为LINQ,

原始代码:

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

我是LINQ的初学者,到目前为止,我不太确定在哪里使用,哪些不在。如果在这种情况下LINQ会给你带来更大的伤害,那么请随时给我发火焰。

编辑:您可以假设AddLink()存在重载,其中包含IEnumerable

2 个答案:

答案 0 :(得分:3)

除非AddLink过载需要集合,否则LINQ将无法避免循环。

是否存在类似的过载:

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

会这样做。


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

  • LINQ是关于表达式的,带有一些对象(对于LINQ到这里使用的对象,总是一个集合)
  • Select extension方法接受一个集合和一个函数并返回一个集合。该函数传递给输入集合的每个元素。然后Select返回由所有函数返回值组成的集合。
  • 我使用lambda expression创建了一个匿名函数,该函数接受一个名为f的参数(其类型将由编译器确定)并返回表达式的值(现在已更正)。
  • AddLinks是AddLink的假定变体,它带有一系列链接。

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

答案 1 :(得分:2)

这里没有火焰,但LINQ在这里不会有任何帮助。如果LINQ有一个ForEach方法(正如previous question中讨论的那样,那么你可以使用它) - 但它没有内置到LINQ中,在这种情况下并没有真正的似乎很有用。

当然,它完全取决于AddLink的作用 - 如果它添加了一个列表链接,你可以改为使用(比方说)List.AddRange,那么你可以使用LINQ。但是这段代码看起来非常简单易读,所以在这种情况下我不会担心。