Создайте перечисление одного

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 ответы

Вы можете использовать Repeat :

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

Или просто массив конечно:

var singleElementArray = new[] { value };

Конечно, версия массива изменена, тогда как Enumerable.Repeat - нет.

9
добавлено
@ sq33G: Это не использует анонимный тип. Он использует неявно типизированный массив - совершенно другой.
добавлено автор Jon Skeet, источник
Массив однопользовательского анонимного типа - это столько LINQier, сколько singleton List of 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
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot