Lieblingsmethode zum Erstellen einer neuen IEnumerable <T> -Sequenz aus einem einzelnen Wert?

97

Normalerweise erstelle ich eine Sequenz aus einem einzelnen Wert mithilfe der Array-Syntax wie folgt:

IEnumerable<string> sequence = new string[] { "abc" };

Oder mit einer neuen Liste. Ich würde gerne hören, ob jemand eine ausdrucksstärkere Art hat, dasselbe zu tun.

Marcel Lamothe
quelle
3
Wie ist das eine leere Sequenz?
CoderDennis
Es ist nur peinlich, dass Dotnet immer noch so etwas nicht hat Enumerable.From<T>(params T[] items).
Gute Nacht Nerd Pride

Antworten:

144

Ihr Beispiel ist keine leere Sequenz, sondern eine Sequenz mit einem Element. Sie können eine leere Folge von Zeichenfolgen erstellen

var sequence = Enumerable.Empty<string>();

BEARBEITEN OP stellte klar, dass sie einen einzigen Wert schaffen wollten. In diesem Fall

var sequence = Enumerable.Repeat("abc",1);
JaredPar
quelle
D'oh, ich wurde abgelenkt, sorry. Ich wollte aus einem einzigen Wert erstellen, nicht aus einer leeren Instanz!
Marcel Lamothe
Dies ist "die Antwort" Flag es?
n8wrl
Diese Methode ist rein funktional als das Erstellen eines neuen Arrays.
Roy Tinker
69

Ich mag, was Sie vorschlagen, aber mit dem Array-Typ weggelassen:

var sequence = new[] { "abc" };
Bryan Watts
quelle
4
Ich habe nie bemerkt, dass du das kannst. Ich denke, das ist klarer als die Verwendung von Repeat.
Marcel Lamothe
1
Aber dies ist kein IEnumerable, es ist ein Array!
Zodman
4
@Bryan Watts Ich weiß das, aber es ist eine konkrete Implementierung eines IEnumerable. Die Frage ist nach einem IEnumerable <> (auch wenn das Beispiel nicht ist). Es besteht ein Unterschied.
Zodman
Vielleicht sollte die Frage geändert werden.
Zodman
1
@ Jonesopolis: Das ist eine andere, nicht verwandte Situation. Sie können verwenden Task.FromResult, um das zu erreichen.
Bryan Watts
21

Oder noch kürzer,

string[] single = { "abc" };

Ich würde eine Erweiterungsmethode machen:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

Oder noch besser und kürzer

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

Vielleicht ist es genau das, was Enumerable.Repeatunter der Haube passiert.

nawfal
quelle
1
Der letzte ist brillant. Mit Ausnahme des Namens ... tritt ein Konflikt mit Typen auf, die bereits IEnumerable implementieren, z. B. die Zeichenfolge in Ihrem Beispiel. Versuchen Sie .AsSingleItemEnumerable () oder einfach .Yield () -> "abc" .Yield ()
DanO
7
Ich denke, ToEnumerable ist angemessener.
Zodman
2
+1 Yieldist gut. Ich habe auch gemacht IEnumerable<T> Yield<T>(this T source, params T[] others).
Jodrell
Ich habe versucht, Yield ganz zugunsten eines Lambda abzuschaffen, aber irgendwie hat es nie kompiliert ... vgl. stackoverflow.com/questions/1217729/… ;-) .
Peter - Stellen Sie Monica
@PeterSchneider wie und warum hast du das gemacht? Ohne Code kann ich keinen Kommentar abgeben. Ich glaube nicht, dass ich dir folge.
Nawfal
5

oder erstellen Sie einfach eine Methode

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

oder

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

Verwendung :

IEnumerable<string> items = CreateEnumerable("single");
Andrew
quelle