Что простой способ состоит в том, чтобы добавить или предварительно ожидать единственное значение к IEnumerable <T>?

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

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

Фу. Существует ли лучший путь? И как Вы обработали бы противоположный случай добавления значения?

9
задан Gabe Moothart 4 August 2010 в 18:29
поделиться

4 ответа

Для этого я написал специальные методы расширения:

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 .

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

23
ответ дан 4 December 2019 в 07:13
поделиться

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

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

 var all = (new[] {GetHeaders()}).Concat(GetData());
7
ответ дан 4 December 2019 в 07:13
поделиться

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
1
ответ дан 4 December 2019 в 07:13
поделиться

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

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() );
0
ответ дан 4 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: