Чи є загальний спосіб передачі одного елемента типу 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>
.
[Редагувати] Як метод розширення він може бути названий:
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;
}
}
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 monad в Microsoft, я здивований, що щось подібне не в першу чергу.