Любимый способ создания новой последовательности IEnumerable <T>из одного значения? - PullRequest
92 голосов
/ 19 июня 2009

Обычно я создаю последовательность из одного значения, используя синтаксис массива, например:

IEnumerable<string> sequence = new string[] { "abc" };

Или используя новый список. Я хотел бы услышать, есть ли у кого-нибудь более выразительный способ сделать то же самое.

Ответы [ 4 ]

139 голосов
/ 19 июня 2009

Ваш пример - не пустая последовательность, это последовательность с одним элементом. Чтобы создать пустую последовательность строк, вы можете сделать

var sequence = Enumerable.Empty<string>();

РЕДАКТИРОВАТЬ ОП пояснил, что они хотели создать одну ценность В этом случае

var sequence = Enumerable.Repeat("abc",1);
63 голосов
/ 20 июня 2009

Мне нравится то, что вы предлагаете, но с опущенным типом массива:

var sequence = new[] { "abc" };
21 голосов
/ 17 февраля 2013

или даже короче,

string[] single = { "abc" };

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

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

Или даже лучше и короче, просто

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

Возможно, это именно то, что Enumerable.Repeat делает под капотом.

5 голосов
/ 18 августа 2016

или просто создайте метод

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

или

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

использование:

IEnumerable<string> items = CreateEnumerable("single");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...