LINQ против урожайности - PullRequest
4 голосов
/ 24 октября 2011

Я почти не использую оператор «yield» (я его не ненавижу :)). Я предпочитаю использовать LINQ, если это возможно. В любом случае, я искал какой-то пост (вы можете найти ссылку ниже) 10 минут назад, прочитал его, и какая-то идея пришла мне в голову:)

переписать-этот-Еогеасп-выход-к-а-Linq-выход

Идея: Возможно, это не очень хорошо, что я не использую «доходность». Возможно, он имеет лучшую производительность, чем LINQ, или какое-то другое преимущество.

Поэтому у меня следующий вопрос, какой код является более «правильным» (yield или LINQ) в приведенном выше примере (в общем случае)?

P.S. Меня интересуют случаи, когда у нас есть возможность использовать LINQ вместо «yield».

Ответы [ 3 ]

8 голосов
/ 24 октября 2011

Я думаю, понятнее , чтобы использовать LINQ в этом случае лично.Он работает на более высоком уровне, чем «вызовите этот метод, дайте этот результат» - он описывает общие результаты.

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

2 голосов
/ 24 октября 2011
public static IEnumerable<Color> GetThemColors(){
     GetThePrimaryIds().Select(id=>yield return GetColorById(id));
     GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
} 

Этот код не работает.Выбор ленив, и эти коллекции не перечислены.

1 голос
/ 24 октября 2011

На данный момент не обращая внимания на то, как Linq может обрабатываться другими поставщиками запросов (например, для базы данных), в примере, на который вы ссылаетесь, у нас есть два разных подхода:

  1. Сначала выведите все изпервое перечисление, затем выведите все из второго.
  2. Вызовите метод Enumerable.Concat.

Ну, что такое Enumerable.Concat?Поскольку мы игнорируем такие случаи, как Linq2SQL (который, вероятно, превратит concat в UNION ALL), здесь нас интересует реализация Linq2Objects.

Теперь существует несколько способов создания оболочки concat, ноМоноисточник (например) заканчивает тем, что вызывает чек и затем:

static IEnumerable<TSource> CreateConcatIterator<TSource> (IEnumerable<TSource> first, IEnumerable<TSource> second)
{
  foreach (TSource element in first)
    yield return element;
  foreach (TSource element in second)
    yield return element;
}

Другими словами, подход LINQ - это подход yield.

Или, если нет, это может быть что-то очень похожее.Мы могли бы (если бы нам нравилось печатать больше) реализовать его как конструкцию реализации IEnumerator<TSource>, но yield избавляет нас от хлопот.

В целом, LINQ - это набор удобных инструментов, которые хорошо работаютвсе вместе.Когда они - инструмент, который работает хорошо, используйте их.Когда другой инструмент работает лучше, используйте его.Когда инструмент, похожий на LINQ, будет полезен, но он не включен в то, что у вас есть, напишите его самостоятельно (точно так же, как мы могли бы делать все вещи Linq2Objects до Linq, чего не было у нас в .NET2.0).

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