472 Stimmen

Übergabe eines einzelnen Elements als IEnumerable<T>

Gibt es eine gängige Methode, um ein einzelnes Element vom Typ T zu einer Methode, die eine IEnumerable<T> Parameter? Sprache ist C#, Framework Version 2.0.

Derzeit verwende ich eine Hilfsmethode (es ist .Net 2.0, so habe ich eine ganze Reihe von Casting/Projecting-Hilfsmethoden ähnlich wie LINQ), aber dies scheint einfach dumm:

public static class IEnumerableExt
{
    // usage: IEnumerableExt.FromSingleItem(someObject);
    public static IEnumerable<T> FromSingleItem<T>(T item)
    {
        yield return item; 
    }
}

Eine andere Möglichkeit wäre natürlich die Erstellung und Befüllung einer List<T> oder ein Array und übergeben Sie es anstelle von IEnumerable<T> .

[Bearbeiten] Als Erweiterungsmethode könnte sie benannt werden:

public static class IEnumerableExt
{
    // usage: someObject.SingleItemAsEnumerable();
    public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

Übersehe ich hier etwas?

[Bearbeiten2] Wir fanden someObject.Yield() (wie @Peter in den Kommentaren unten vorschlug) für den besten Namen für diese Erweiterungsmethode, vor allem der Kürze halber, also hier ist er zusammen mit dem XML-Kommentar, falls jemand ihn verwenden möchte:

public static class IEnumerableExt
{
    /// <summary>
    /// Wraps this object instance into an IEnumerable&lt;T&gt;
    /// 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&lt;T&gt; consisting of a single item. </returns>
    public static IEnumerable<T> Yield<T>(this T item)
    {
        yield return item;
    }
}

210voto

Mario F Punkte 41039

Nun, wenn die Methode eine IEnumerable müssen Sie etwas übergeben, das eine Liste ist, auch wenn sie nur ein Element enthält.

vorbei an

new[] { item }

als Argument sollte ausreichen, denke ich

147voto

luksan Punkte 7463

In C# 3.0 können Sie die Klasse System.Linq.Enumerable verwenden:

// using System.Linq

Enumerable.Repeat(item, 1);

Dadurch wird eine neue IEnumerable erstellt, die nur Ihr Element enthält.

112voto

Jon Skeet Punkte 1325502

Ihre Helfer-Methode ist IMO die sauberste Art, dies zu tun. Wenn Sie in einer Liste oder ein Array übergeben, dann ein skrupelloses Stück Code könnte es casten und ändern Sie den Inhalt, was zu seltsamen Verhalten in einigen Situationen. Man könnte eine schreibgeschützte Sammlung verwenden, aber das würde wahrscheinlich noch mehr Wrapping bedeuten. Ich denke, Ihre Lösung ist so sauber, wie es nur geht.

45voto

Ðаn Punkte 10643

In C# 3 (ich weiß, Sie sagten 2), können Sie eine generische Erweiterungsmethode schreiben, die die Syntax ein wenig akzeptabler machen könnte:

static class IEnumerableExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T item)
    {
        yield return item;
    }
}

Client-Code ist dann item.ToEnumerable() .

28voto

duraid Punkte 584

Diese Hilfsmethode funktioniert für item oder many.

public static IEnumerable<T> ToEnumerable<T>(params T[] items)
{
    return items;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X