#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;
}
И это, конечно, работает, если вы вызываете его с одним аргументом. Но, возможно, в фреймворке уже есть что-то подобное, чего я еще не обнаружил.