Czy istnieje wspólny sposób przekazywania pojedynczego elementu typu Tdo 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 Arrayi 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;
}
}
AsEnumerableponieważ wbudowane rozszerzenie o tej nazwie już istnieje . (Gdy Timplementuje IEnumerablenp string..)
Yield? Nic nie przebije zwięzłości.
left==nullczeku 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ą,xsdobrze). 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.