Как преобразовать этот код в LINQ? - PullRequest
2 голосов
/ 21 февраля 2009

Я пытаюсь написать это как LINQ,

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 21 февраля 2009

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

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

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

сделает это.


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

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

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

2 голосов
/ 21 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...