432 votes

En passant un seul élément comme IEnumerable<T></T>

Est a t-il un moyen de passer d'un seul élément de type T pour une méthode qui attend un IEnumerable<T> paramètre? La langue est le C#, framework version 2.0.

Actuellement, je suis en utilisant une méthode d'aide (c'est .Net 2.0, donc j'ai tout un tas de coulée/projection méthodes d'aide semblable à LINQ), mais cela semble tout simplement ridicule:

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

Autre façon serait de créer et peupler List<T> ou Array et passe à la place de IEnumerable<T>.

[Edit] Comme une extension de la méthode, il peut être nommé:

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

Suis-je manqué quelque chose?

[Edit2] Nous avons constaté someObject.Yield() (@Pierre suggéré dans les commentaires ci-dessous) pour être le meilleur nom pour cette extension de la méthode, principalement pour des raisons de concision, si elle est ici, avec le commentaire XML si quelqu'un veut-il simplement de la saisir:

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 wrapped object.</typeparam>
    /// <param name="item"> The object to wrap.</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;
    }
}

172voto

Mario Fernandez Points 8974

Eh bien, si la méthode attend un `` tu dois passer quelque chose c’est une liste, même s’il contient un élément seulement.

en passant

l’argument doit être assez je pense

134voto

luksan Points 4063

Dans c# 3.0, vous pouvez utiliser la classe System.Linq.Enumerable :

Cela créera un nouveau IEnumerable qui contient uniquement votre article.

109voto

Jon Skeet Points 692016

Votre méthode d’assistance est la plus propre façon de le faire, l’OMI. Si vous passez dans une liste ou un tableau, puis un morceau peu scrupuleux du code pourrait effectuer un cast et modifier le contenu, menant à des comportements bizarres dans certaines situations. Vous pouvez utiliser une collection en lecture seule, mais qui est susceptible d’entraîner l’enveloppe encore plus. Je pense que votre solution est aussi propre qu’il obtient.

43voto

Dan Points 3922

En C# 3 (je sais que vous avez dit 2), vous pouvez écrire une méthode d’extension générique qui pourrait rendre un peu plus acceptable par la syntaxe :

le code client est alors `` .

12voto

Joshua Starner Points 655

Je suis un peu surpris que personne n’a suggéré une nouvelle surcharge de la méthode avec un argument de type T pour simplifier l’API cliente.

Maintenant votre code client peut seulement procédez comme suit :

ou une liste :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X