Czy istnieje wspólny sposób przekazywania pojedynczego elementu typu T
do metody, która oczekuje IEnumerable<T>
parametru? Językiem jest C #, wersja ramowa 2.0.
Obecnie używam metody pomocniczej (to .Net 2.0, więc mam całą masę rzutowych / rzutujących metod pomocniczych podobnych do LINQ), ale to po prostu wydaje się głupie:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Innym sposobem byłoby oczywiście utworzenie i wypełnienie pola a List<T>
lub an Array
i podanie go zamiast IEnumerable<T>
.
[Edytuj] Jako metodę rozszerzenia może mieć nazwę:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Czy coś mi umyka?
[Edytuj2] Odkryliśmy someObject.Yield()
(jak sugeruje @Peter w komentarzach poniżej), że jest to najlepsza nazwa dla tej metody rozszerzenia, głównie ze względu na zwięzłość, więc tutaj jest wraz z komentarzem XML, jeśli ktoś chce go złapać:
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
ponieważ wbudowane rozszerzenie o tej nazwie już istnieje . (Gdy T
implementuje IEnumerable
np string
..)
Yield
? Nic nie przebije zwięzłości.
left==null
czeku tutaj. Łamie piękno kodu i przestaje być bardziej elastyczny - co jeśli kiedyś okaże się, że trzeba wygenerować singleton z czymś, co może być zerowe? Mam na myśli, że new T[] { null }
to nie to samo, co new T[] {}
pewnego dnia może być konieczne ich rozróżnienie.
if (item == null) yield break;
teraz przestajesz przekazywać wartości zerowe, a także korzystać z (trywialnego) wzorca obiektów zerowychIEnumerable
. (foreach (var x in xs)
radzi sobie z pustą,xs
dobrze). Nawiasem mówiąc, ta funkcja jest jednostką monadyczną dla listy monadIEnumerable<T>
, a biorąc pod uwagę festiwal miłosny monad w Microsoft, jestem zaskoczony, że coś takiego nie znajduje się w ramach.