Я должен предварительно ожидать единственное значение к IEnumerable (в этом случае, IEnumerable<string[]>
). Чтобы сделать это, я создаю a List<T>
только для обертывания первого значения так, чтобы я мог звонить Concat
:
// get headers and data together
IEnumerable<string[]> headers = new List<string[]> {
GetHeaders()
};
var all = headers.Concat(GetData());
Фу. Существует ли лучший путь? И как Вы обработали бы противоположный случай добавления значения?
Для этого я написал специальные методы расширения:
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T item)
{
foreach (T i in source)
yield return i;
yield return item;
}
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T item)
{
yield return item;
foreach (T i in source)
yield return i;
}
В вашем сценарии вы должны написать:
var all = GetData().Prepend(GetHeaders());
Как прокомментировал chilltemp, это не изменяет исходную коллекцию. Как и в случае с Linq, он генерирует новый IEnumerable
.
Примечание: Для источника
рекомендуется активная проверка нулевого аргумента, но не показана для краткости.
Используйте метод расширения Enumerable.Concat . Для добавления значений вместо добавления в начале просто вызовите Concat
в обратном порядке. (например: GetData (). Concat (GetHeaders ());
)
Если GetHeaders ()
возвращает единственный строковый массив, я бы лично, вероятно, заключил его в один массив элементов вместо списка:
var all = (new[] {GetHeaders()}).Concat(GetData());
Rx содержит метод StartWith, который добавляет значение к последовательности. Также Return может обернуть значение как последовательность, чтобы его можно было добавить через Concat.
var c = new[] {4};
var c1 = c.StartWith(1, 2, 3);
var c2 = c1.Concat(EnumerableEx.Return(5));
c2.Run(Console.Write); // 12345
Другой вариант - вспомогательный метод, который создает последовательность из одного элемента:
public static class EnumerableExt
{
public static IEnumerable<T> One<T>(T item)
{
yield return item;
}
}
...
//prepend:
EnumerableExt.One( GetHeaders() ).Concat( GetData() );
//append:
GetData().Concat( EnumerableExt.One( GetHeaders() );