Esiste un modo comune per passare un singolo elemento di tipo Ta 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 Arraye 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;
}
}
AsEnumerableperché esiste già un'estensione integrata con quel nome . (Quando Timplementa IEnumerable, ad es string.)
Yield? Niente batte la brevità.
left==nullcontrollo 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 vuotoxsbenissimo). 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.