Створіть перерахування одного

If I want an empty enumeration, I can call Enumerable.Empty(). But what if I want to convert a scalar type to an enumeration?

Normally I'd write new List {myString} to pass myString to a function that accepts IEnumerable. Is there a more LINQ-y way?

5
@msarchet: Ну, Enumerable знаходиться в просторі назв System.Linq .
додано Автор BoltClock, джерело
що ви маєте на увазі більше LINQ-y? LINQ - це запит, і ви щось створюєте. Enumerable! = Linq
додано Автор msarchet, джерело

4 Відповіді

Ви можете скористатися Повторити

var justOne = Enumerable.Repeat(value, 1);

Або просто масив:

var singleElementArray = new[] { value };

Версія масиву змінюється, звичайно, тоді як Enumerable.Repeat не є.

9
додано
@ sq33G: Це не використання анонімного типу. Він використовує неявно введений масив - абсолютно інший.
додано Автор Jon Skeet, джерело
Масив синглетонного анонімного типу - це стільки LINQier, скільки синглетонний список int, тому що він отримав анонімний!
додано Автор sq33G, джерело
Моє ліжко. Проте перевершує простий список у тесті LINQiness.
додано Автор sq33G, джерело

Мабуть, найкоротша форма

var sequence = new[] { value };
3
додано

Є, але це менш ефективно, ніж використання списку або масиву:

// an enumeration containing only the number 13.
var oneIntEnumeration = Enumerable.Repeat(13, 1);
3
додано
Чому це менш ефективно, ніж використання списку або масиву?
додано Автор phoog, джерело
Мені дуже сподобався ваш блог на цій темі: blackrabbitcoder.net/BlackRabbitCoder/archive/2011/12/08/…
додано Автор TrueWill, джерело
@phoog: тільки з точки зору швидкості виконання, побудова масиву з одним елементом швидше (хоча дуже, дуже невелика різниця). Тим не менш, Enumerable.Repeat() має те, що, звичайно ж, дає вам щось, що лише для читання.
додано Автор James Michael Hare, джерело
@phoog: для 1 мільйона творінь var oneIntArray = new int [] {13}; 3 мс, var oneIntEnumeration = Enumerable.Repeat (13, 1); 15 ms (всі часи на моїй машині, звичайно). Отже, це дуже незначна різниця між дзвінками і, можливо, лише мікро-оптимізація. Я б використовував те, що вам найбільше подобається, обидві роботи.
додано Автор James Michael Hare, джерело
@TrueWill: Дякуємо!
додано Автор James Michael Hare, джерело

Можна також написати власний метод розширення:

public static class Extensions
{
    public static IEnumerable AsEnumerable(this T item)
    {
         yield return item;
    }
}

Тепер я цього не зробив і тепер, коли знаю про Enumerable.Repeat, я, напевно, ніколи не буду (дізнаюся щось нове щодня). Але я зробив це:

public static IEnumerable MakeEnumerable(params T[] items)
{
     return items;
}

І це, звичайно, працює, якщо ви називаєте його одним аргументом. Але, можливо, у такому випадку вже є щось подібне, що я ще не виявив.

1
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug