Existe-t-il un moyen courant de passer un seul élément de type T
à une méthode qui attend un IEnumerable<T>
paramètre? Le langage est C #, framework version 2.0.
Actuellement, j'utilise une méthode d'assistance (c'est .Net 2.0, j'ai donc tout un tas de méthodes d'aide à la coulée / projection similaires à LINQ), mais cela semble juste idiot:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Une autre façon serait bien sûr de créer et de remplir un List<T>
ou un Array
et de le passer à la place de IEnumerable<T>
.
[Modifier] En tant que méthode d'extension, elle pourrait être nommée:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Est-ce que j'ai râté quelque chose?
[Edit2] Nous avons trouvé someObject.Yield()
(comme @Peter l'a suggéré dans les commentaires ci-dessous) comme étant le meilleur nom pour cette méthode d'extension, principalement pour la brièveté, alors voici avec le commentaire XML si quelqu'un veut l'attraper:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// 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<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
AsEnumerable
car une extension intégrée portant ce nom existe déjà . (Quand T
implémente IEnumerable
, par exemple string
.)
Yield
? Rien ne vaut la brièveté.
left==null
chèque ici. Cela brise la beauté du code et empêche le code d'être plus flexible - et si un jour vous deviez générer un singleton avec quelque chose qui peut être nul? Je veux dire, ce new T[] { null }
n'est pas la même chose new T[] {}
, et un jour vous devrez peut-être les distinguer.
if (item == null) yield break;
Maintenant, vous êtes empêché de passer null ainsi que de profiter du modèle d'objet null (trivial) pourIEnumerable
. (foreach (var x in xs)
gère un videxs
très bien). Soit dit en passant, cette fonction est l'unité monadique pour la monade de liste qui estIEnumerable<T>
, et étant donné le festival d'amour de la monade chez Microsoft, je suis surpris que quelque chose comme ça ne soit pas dans le cadre en premier lieu.