2009-02-21 7 views
2

Я пытаюсь написать это как LINQ,Как преобразовать этот код в LINQ?

Оригинальный код:

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

Я новичок LINQ, до сих пор я не совсем уверен, где использовать и где не , Если в этом случае LINQ будет приносить больше вреда, тогда помогите, не стесняйтесь меня плакать.

Edit: Можно предположить, что существует перегрузка для AddLink(), который принимает IEnumerable

ответ

3

Если не перегрузка AddLink, которая принимает коллекцию, LINQ не избежать петли.

Есть такая перегрузка, то что-то вроде:

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

бы это сделать.


Как приведенное выше выражение работает (кратко):

  • LINQ о выражениях, принимая какой-то объект (для LINQ к объектам, используемых здесь, всегда коллекция)
  • Select метод расширения занимает коллекции и функции и возвращает коллекцию. Функция передается каждому элементу входной коллекции. И затем Select возвращает коллекцию, состоящую из всех возвращаемых значений функции.
  • Я использовал lambda expression для создания анонимной функции, которая принимает один аргумент с именем f (его тип будет определяться компилятором) и возвращает значение выражения (теперь исправлено).
  • AddLinks - это предполагаемый вариант вашей AddLink, который берет набор ссылок.

Существует много событий, это одно из преимуществ LINQ, это компактный способ выражения манипуляций с данными без обычных накладных расходов явных циклов и временных переменных.

+0

Я предполагаю, что это C# (по крайней мере, VS не понравилось в VB), я в порядке с преобразованием любого нормального C# в VB.NET, но не могу отличить от операторов LINQ в C# –

+0

См. обновление для ответа. – Richard

+0

Спасибо за обновление, просто вычислил способ VB для этого: AllLinks.AddRange (MyForms.Select (Function (xform) xform.GetAsLink (AttackResponse))) –

2

Здесь нет пламени, но LINQ здесь не поможет. Если у LINQ был метод ForEach (как обсуждалось в previous question, а также в другом месте), вы можете использовать его, но он не встроен в LINQ, и в этом случае для него это не очень удобно.

Конечно, это зависит от того, что именно AddLink делает - если он добавляет ссылку на список, и вы могли бы использовать вместо (скажем) List.AddRange, то вы могли использовать LINQ. Но этот код кажется довольно простым и читаемым, поэтому я не стал бы волноваться в этом случае.

Смежные вопросы