Вставить элемент с помощью LINQ - PullRequest
1 голос
/ 09 мая 2011

Учитывая, что у меня есть IEnumerable (e) и одно значение T (t). Какой самый простой способ сделать:

IEnumerable<T> newCollection = t+e

На данный момент я делаю:

ItemArray = Enumerable.Repeat<object>(t, 1).Concat(e);

, что довольно нечитабельно, так как я не повторяю здесь. Я также попробовал:

IEnumerable<T> newCollection = new List<object> { t}.Concat(e);

Но этот создает ненужный объект List, который также не является оптимальным.

У кого-нибудь есть идея получше?

Ответы [ 3 ]

6 голосов
/ 09 мая 2011

В MoreLINQ у нас есть метод Prepend, который вас может заинтересовать. Итак, ваш код будет:

ItemArray = e.Prepend(t);

РЕДАКТИРОВАТЬ: Prepend делает только то, что делает ваш текущий код - я просто предлагаю реорганизовать его в метод, который скрывает часть Repeat / Concat и оставляет вам более читабельный вызов код.

3 голосов
/ 09 мая 2011

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

newCollection = new[] { t }.Concat(e);
2 голосов
/ 09 мая 2011

Вместо списка, который является более сложным объектом, попробуйте создать простой массив. Это может быть быстрее:

IEnumerable<T> newCollection = new [] { t}.Concat(e);

Теперь я скажу вам, что для добавления этого элемента в Linq необходимо создать новую коллекцию какого-либо типа. Это потому, что Linq предназначен для работы с перечислимыми, и потому что он не имеет побочных эффектов; независимо от того, что вы делаете в операторе Linq, исходные перечисления остаются такими же, какими они были до вашего запуска (если только вы не имеете дело с пользовательской коллекцией, у которой есть перечисленные побочные эффекты). В результате на каком-то уровне Linq должен рассматривать ваш отдельный элемент как коллекцию, содержащую этот один элемент, чтобы он мог перечислять эту коллекцию для получения любого результата, который вы пожелаете. Это верно независимо от того, скрываете ли вы реализацию за методом расширения, как в MoreLINQ, или нет.

...