Tek bir öğe türünü parametre T
bekleyen 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 Array
ve 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 T
uygular IEnumerable
, örneğin string
.)
Yield
? Hiçbir şey kısalığı yenemez.
left==null
Buradaki ç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ş birxs
para 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.