Есть ли общий способ передачи одного элемента типа T
в метод, который ожидает IEnumerable<T>
параметр? Язык - C #, версия фреймворка 2.0.
В настоящее время я использую вспомогательный метод (это .Net 2.0, поэтому у меня есть целая куча вспомогательных методов приведения / проектирования, похожих на LINQ), но это просто кажется глупым:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Другой способ, конечно, состоит в том, чтобы создать и заполнить List<T>
или Array
передать и передать его вместо IEnumerable<T>
.
[Edit] В качестве метода расширения его можно назвать:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Я что-то здесь упускаю?
[Edit2] Мы нашли someObject.Yield()
(как предложил @Peter в комментариях ниже) лучшее имя для этого метода расширения, в основном для краткости, поэтому здесь, наряду с комментарием XML, если кто-то захочет его взять:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a single item.
/// </summary>
/// <typeparam name="T"> Type of the object. </typeparam>
/// <param name="item"> The instance that will be wrapped. </param>
/// <returns> An IEnumerable<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
AsEnumerable
потому что встроенное расширение с таким именем уже существует . (Когда T
реализует IEnumerable
, например,. string
)
Yield
? Ничто не сравнится с краткостью.
left==null
чек здесь. Это нарушает красоту кода и делает его более гибким - что если однажды вам понадобится синглтон с чем-то, что может быть нулевым? Я имею в виду, new T[] { null }
не то же самое new T[] {}
, и когда-нибудь вам, возможно, придется различать их.
if (item == null) yield break;
теперь вам не разрешено передавать значение null, а также использовать (тривиальный) шаблон нулевого объекта дляIEnumerable
. (foreach (var x in xs)
справляется с пустымxs
просто отлично). Между прочим, эта функция является монадической единицей для монады списка, которая естьIEnumerable<T>
, и, учитывая монаду love-fest в Microsoft, я удивлен, что что-то подобное не входит в рамки в первую очередь.