Maak een opsomming van één

If I want an empty enumeration, I can call Enumerable.Empty(). But what if I want to convert a scalar type to an enumeration?

Normally I'd write new List {myString} to pass myString to a function that accepts IEnumerable. Is there a more LINQ-y way?

5
@msarchet: Nou, Opnamen bevinden zich in de System.Linq naamruimte.
toegevoegd de auteur BoltClock, de bron
wat bedoel je met meer LINQ-y? LINQ is query en u maakt iets. Enumerable! = Linq
toegevoegd de auteur msarchet, de bron

4 antwoord

U kunt Repeat gebruiken:

var justOne = Enumerable.Repeat(value, 1);

Of gewoon een reeks natuurlijk:

var singleElementArray = new[] { value };

De array-versie kan natuurlijk worden gewijzigd, terwijl Enumerable.Repeat dat niet is.

9
toegevoegd
@ sq33G: dat gebruikt geen anoniem type. Het gebruikt een impliciet getypeerde array - compleet anders.
toegevoegd de auteur Jon Skeet, de bron
Serie van singleton anonieme type is zoveel LINQier dan singleton Lijst van int omdat het anoniem is!
toegevoegd de auteur sq33G, de bron
Mijn fout. Nog steeds verslaat de eenvoudige lijst in de test van LINQiness.
toegevoegd de auteur sq33G, de bron

Misschien is de kortste vorm wel

var sequence = new[] { value };
3
toegevoegd

Er is, maar het is minder efficiënt dan het gebruik van een lijst of matrix:

// an enumeration containing only the number 13.
var oneIntEnumeration = Enumerable.Repeat(13, 1);
3
toegevoegd
Waarom is dit minder efficiënt dan het gebruik van een lijst of matrix?
toegevoegd de auteur phoog, de bron
toegevoegd de auteur TrueWill, de bron
@phoog: alleen in termen van uitvoeringssnelheid is de constructie van een array met één element sneller (hoewel heel, heel klein verschil). Dat gezegd hebbende, heeft de Enumerable.Repeat() het voordeel dat je iets krijgt dat alleen-lezen is.
toegevoegd de auteur James Michael Hare, de bron
@phoog: voor 1 miljoen creaties var oneIntArray = new int [] {13}; is 3 ms en var oneIntEnumeration = Enumerable.Repeat (13, 1); is 15 ms (alle tijden op mijn machine natuurlijk). Dat is dus ZEER klein per oproepverschil en waarschijnlijk alleen een micro-optimalisatie. Ik zou gebruiken wat je het beste bevalt, beide werken.
toegevoegd de auteur James Michael Hare, de bron
@TrueWill: Bedankt!
toegevoegd de auteur James Michael Hare, de bron

U kunt ook uw eigen uitbreidingsmethode schrijven:

public static class Extensions
{
    public static IEnumerable AsEnumerable(this T item)
    {
         yield return item;
    }
}

Nu heb ik dat niet gedaan en nu ik weet over Enumerable. Herhaal, zal ik waarschijnlijk nooit doen (elke dag iets nieuws leren). Maar ik heb dit gedaan:

public static IEnumerable MakeEnumerable(params T[] items)
{
     return items;
}

En dit werkt natuurlijk als je het met een enkel argument noemt. Maar misschien zit er al zoiets in het raamwerk, dat ik nog niet heb ontdekt.

1
toegevoegd