Esiste un modo comune per passare un singolo elemento di tipo T
a un metodo che prevede un IEnumerable<T>
parametro? La lingua è C #, framework versione 2.0.
Attualmente sto usando un metodo helper (è .Net 2.0, quindi ho un sacco di metodi helper di casting / proiezione simili a LINQ), ma questo sembra sciocco:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Un altro modo sarebbe ovviamente quello di creare e popolare un List<T>
o un Array
e passarlo invece di IEnumerable<T>
.
[Modifica] Come metodo di estensione potrebbe essere chiamato:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Mi sto perdendo qualcosa qui?
[Modifica2] Abbiamo trovato someObject.Yield()
(come suggerito da @Peter nei commenti seguenti) il nome migliore per questo metodo di estensione, principalmente per brevità, quindi eccolo insieme al commento XML se qualcuno vuole afferrarlo:
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
perché esiste già un'estensione integrata con quel nome . (Quando T
implementa IEnumerable
, ad es string
.)
Yield
? Niente batte la brevità.
left==null
controllo qui. Rompe il beauti del codice e impedisce che il codice sia più flessibile - cosa succede se un giorno si scopre la necessità di generare un singleton con qualcosa che può essere nullo? Voglio dire, new T[] { null }
non è la stessa cosa new T[] {}
, e un giorno potresti aver bisogno di distinguerli.
if (item == null) yield break;
ora ti viene impedito di passare a null e di sfruttare il modello (banale) di oggetti null perIEnumerable
. (foreach (var x in xs)
gestisce un vuotoxs
benissimo). Per inciso, questa funzione è l'unità monadica della lista monade che èIEnumerable<T>
, e data la festa d'amore della monade alla Microsoft, sono sorpreso che qualcosa del genere non sia nel framework in primo luogo.