На данный момент не обращая внимания на то, как Linq может обрабатываться другими поставщиками запросов (например, для базы данных), в примере, на который вы ссылаетесь, у нас есть два разных подхода:
- Сначала выведите все изпервое перечисление, затем выведите все из второго.
- Вызовите метод
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).