Tek bir öğe türünü parametre Tbekleyen bir yönteme geçirmenin yaygın bir yolu var mı IEnumerable<T>? Dil C #, çerçeve sürümü 2.0.
Şu anda bir yardımcı yöntem kullanıyorum (bu. Net 2.0, bu yüzden döküm / projelendirme yardımcı yöntemleri LINQ benzer bir sürü var), ama bu sadece aptalca görünüyor:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Başka bir yol elbette bir List<T>veya bir oluşturmak ve doldurmak Arrayve yerine geçmek olacaktır IEnumerable<T>.
[Düzenle] Bir uzantı yöntemi olarak adlandırılabilir:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Burada bir şey mi eksik?
[Edit2] We found someObject.Yield()(@Peter aşağıdaki yorum önerdiği gibi) işte o kimse yakala istiyorsa XML açıklama ile birlikte olduğunu, ağırlıklı olarak kısalık için, bu uzantı yöntemi için en iyi isim olarak:
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çünkü bu ada sahip yerleşik bir uzantı zaten vardır . (Ne zaman Tuygular IEnumerable, örneğin string.)
Yield? Hiçbir şey kısalığı yenemez.
left==nullBuradaki çekten nefret ediyorum . Kodun güzelliğini kırar ve kodun daha esnek olmasını durdurur - eğer bir gün ortaya çıkarsanız boş olabilecek bir şeyle bir singleton üretmeniz gerekir? Yani, new T[] { null }aynı değildir new T[] {}ve bir gün onları ayırt etmeniz gerekebilir.
if (item == null) yield break;Şimdi null'u geçmenin yanı sıra (önemsiz) null nesne deseninden yararlanmıyorsunuzIEnumerable. (foreach (var x in xs)boş birxspara cezası ile ilgilenir). Bu arada, bu işlev liste monad için monadik birimdirIEnumerable<T>ve Microsoft'ta monad aşk şenliği göz önüne alındığında, bunun gibi bir şey ilk başta çerçeve içinde değil şaşırdım.