Есть ли общий способ передачи одного элемента типа 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, я удивлен, что что-то подобное не входит в рамки в первую очередь.