Gibt es eine übliche Möglichkeit, ein einzelnes Element vom Typ T
an 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 Array
und 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;
}
}
AsEnumerable
da bereits eine integrierte Erweiterung mit diesem Namen vorhanden ist . (Wenn T
implementiert IEnumerable
, z string
. B. )
Yield
? Nichts geht über die Kürze.
left==null
Scheck 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 leerexs
ganz 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.