Gibt es eine übliche Möglichkeit, ein einzelnes Element vom Typ Tan eine Methode zu übergeben, die einen IEnumerable<T>Parameter erwartet ? Die Sprache ist C #, Framework Version 2.0.
Derzeit verwende ich eine Hilfsmethode (es ist .Net 2.0, daher habe ich eine ganze Reihe von Hilfsmethoden zum Casting / Projizieren, die LINQ ähneln), aber das scheint einfach albern:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Ein anderer Weg wäre natürlich, ein List<T>oder ein zu erstellen und zu füllen Arrayund es stattdessen zu übergeben IEnumerable<T>.
[Bearbeiten] Als Erweiterungsmethode könnte es heißen:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Vermisse ich hier etwas?
[Edit2] Wir haben festgestellt someObject.Yield()(wie @Peter in den Kommentaren unten vorgeschlagen hat), dass dies der beste Name für diese Erweiterungsmethode ist, hauptsächlich aus Gründen der Kürze. Hier ist es also zusammen mit dem XML-Kommentar, wenn jemand ihn greifen möchte:
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;
}
}
AsEnumerableda bereits eine integrierte Erweiterung mit diesem Namen vorhanden ist . (Wenn Timplementiert IEnumerable, z string. B. )
Yield? Nichts geht über die Kürze.
left==nullScheck hier. Es bricht die Schönheit des Codes und verhindert, dass der Code flexibler wird - was ist, wenn Sie eines Tages einen Singleton mit etwas generieren müssen, das null sein kann? Ich meine, new T[] { null }ist nicht dasselbe wie new T[] {}, und eines Tages müssen Sie sie möglicherweise unterscheiden.
if (item == null) yield break;Jetzt können Sie keine Null mehr übergeben und das (triviale) Null-Objektmuster für nutzenIEnumerable. (foreach (var x in xs)behandelt eine leerexsganz gut). Übrigens ist diese Funktion die monadische Einheit für die ListenmonadeIEnumerable<T>, und angesichts des Monaden-Liebesfestes bei Microsoft bin ich überrascht, dass so etwas überhaupt nicht im Framework enthalten ist.