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.


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);

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" };

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.


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");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.