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

#c# #linq #c#-4.0

#c# #linq #c #-4.0

Вопрос:

Если мне нужно пустое перечисление, я могу позвонить Enumerable.Empty<T>() . Но что, если я хочу преобразовать скалярный тип в перечисление?

Обычно я бы написал new List<string> {myString} , чтобы передать myString функцию, которая принимает IEnumerable<string> . Есть ли более простой способ LINQ-y?

Комментарии:

1. что вы подразумеваете под большим количеством LINQ-y? LINQ — это запрос, и вы что-то создаете. Перечисляемый != linq

2. @msarchet: Ну, Enumerable это в System.Linq пространстве имен.

Ответ №1:

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

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

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

 var singleElementArray = new[] { value };
 

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

Комментарии:

1. Массив одноэлементного анонимного типа намного связнее, чем одноэлементный список int, потому что он анонимный!

2. @sq33G: Это не использование анонимного типа. Он использует неявно типизированный массив — совершенно другой.

3. Мой плохой. Все еще превосходит простой список в тесте на связность.

Ответ №2:

Возможно, самая короткая форма

 var sequence = new[] { value };
 

Ответ №3:

Существует, но это менее эффективно, чем использование списка или массива:

 // an enumeration containing only the number 13.
var oneIntEnumeration = Enumerable.Repeat(13, 1);
 

Комментарии:

1. Почему это менее эффективно, чем использование списка или массива?

2. @phoog: просто с точки зрения скорости выполнения, построение одноэлементного массива происходит быстрее (хотя разница очень, очень мала). Тем не менее, Enumerable.Repeat() преимущество заключается в том, что, конечно, оно доступно только для чтения.

3. @phoog: для 1 миллиона творений var oneIntArray = new int[] { 13 }; это 3 мс и var oneIntEnumeration = Enumerable.Repeat(13, 1); 15 мс (все время на моей машине, конечно). Так что это ОЧЕНЬ незначительная разница для каждого вызова и, вероятно, просто микрооптимизация. Я бы использовал то, что вам больше нравится, оба работают.

4. Мне очень понравился ваш пост в блоге по этому поводу: blackrabbitcoder.net/BlackRabbitCoder/archive/2011/12/08 /…

Ответ №4:

Вы также можете написать свой собственный метод расширения:

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

Теперь я этого не делал, и теперь, когда я знаю о Enumerable.Повторяю, я, вероятно, никогда этого не сделаю (каждый день узнаю что-то новое). Но я уже сделал это:

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

И это, конечно, работает, если вы вызываете его с одним аргументом. Но, возможно, в фреймворке уже есть что-то подобное, чего я еще не обнаружил.