Улюблений спосіб створити нову послідовність IEnumerable <T> з одного значення?


97

Зазвичай я створюю послідовність з одного значення, використовуючи синтаксис масиву, наприклад:

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

Або за допомогою нового Списку. Я хотів би почути, чи хтось має більш виразний спосіб зробити те саме.


3
Як це порожня послідовність?
CoderDennis

Просто незручно, що у dotnet досі немає чогось подібного Enumerable.From<T>(params T[] items).
Доброї ночі гордість ботаніка

Відповіді:


144

Ваш приклад - це не порожня послідовність, це послідовність з одним елементом. Ви можете створити порожню послідовність рядків

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

EDIT OP пояснив, що вони прагнуть створити єдину цінність. В такому разі

var sequence = Enumerable.Repeat("abc",1);

О, я відволіклась, вибачте. Я мав на увазі створення з одного значення, а не створення порожнього екземпляра!
Марсель Ламоте

Це прапор "відповіді"?
n8wrl

Цей метод є більш функціональним, ніж створення нового масиву.
Рой Тінкер

69

Мені подобається те, що ви пропонуєте, але з опущеним типом масиву:

var sequence = new[] { "abc" };

4
Я ніколи не розумів, що ти можеш це зробити. Я думаю, що це зрозуміліше, ніж використання Repeat.
Марсель Ламоте,

1
Але це не IEnumerable, це масив!
Zodman

4
@Bryan Watts Я це знаю, але це конкретна реалізація IEnumerable. Питання полягає в запиті IEnumerable <> (навіть якщо приклад цього немає). Є різниця.
Zodman

Можливо, питання слід змінити.
Zodman

1
@ Jonesopolis: Це інша, не пов'язана ситуація. Ви можете використовувати Task.FromResultдля досягнення цього.
Брайан Уоттс,

21

Або навіть коротше,

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робиться під капотом.


1
Останній - блискучий. За винятком назви ... воно буде конфліктувати з типами, які вже реалізують IEnumerable, такими як рядок у вашому прикладі. Спробуйте .AsSingleItemEnumerable (), або просто .Yield () -> "abc" .Yield ()
DanO

7
Я думаю, що ToEnumerable є більш доречним.
Zodman

2
+1 Yield- це добре. Я IEnumerable<T> Yield<T>(this T source, params T[] others)теж зробив .
Джодрелл

Я намагався взагалі покінчити з Виходом на користь лямбда, але якось вона так і не склалася ... пор. stackoverflow.com/questions/1217729/… ;-).
Пітер - Відновити Моніку

@PeterSchneider як і чому ти це зробив? Не бачачи коду, я не можу коментувати. Я не думаю, що йду за тобою.
nawfal

5

або просто створити метод

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");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.