Какой простой способ добавить или добавить одно значение в IEnumerable <T>? - PullRequest
9 голосов
/ 04 августа 2010

Мне нужно добавить одно значение к IEnumerable (в данном случае IEnumerable<string[]>).Для этого я создаю List<T>, просто чтобы обернуть первое значение, чтобы я мог вызвать Concat:

// get headers and data together
IEnumerable<string[]> headers = new List<string[]> {
    GetHeaders()
};
var all = headers.Concat(GetData());

Yuck.Есть ли способ лучше?И как бы вы справились с противоположным случаем добавления значения?

Ответы [ 4 ]

23 голосов
/ 04 августа 2010

Я написал собственные методы расширения для этого:

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<T>.

Примечание: Рекомендуется проверка пустых аргументов для source, но для краткости не показана.

7 голосов
/ 04 августа 2010

Используйте метод расширения Enumerable.Concat .Чтобы добавить значения вместо предварительного, вам нужно просто позвонить Concat в обратном порядке.(т.е.: GetData().Concat(GetHeaders());)

Если GetHeaders() возвращает один массив строк, я лично, вероятно, заключу его в один массив элементов вместо списка:

 var all = (new[] {GetHeaders()}).Concat(GetData());
1 голос
/ 04 августа 2010

Rx содержит метод StartWith, который добавляет значение в последовательность.Также Return может переносить значение как последовательность, чтобы его можно было добавить через Concat.

0 голосов
/ 04 августа 2010

Другим вариантом является вспомогательный метод, который создает последовательность из одного элемента:

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() );
...