IEnumerable<T>
için bir Uzantı Yöntemini nasıl tanımlarım IEnumerable<T>
döndürür? Amaç, Uzantı Yönteminin tüm IEnumerable
ve IEnumerable<T>
için kullanılabilir olması durumunda T
anonim bir tür olabilir.IEnumerable <T> için bir uzantı yöntemi tanımlayın ve IEnumerable <T> döndürür?
cevap
bir yineleyici yazmak için en kolay yol, örneğin, bir yineleyici blok ile:
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate)
{
foreach(T value in data)
{
if(predicate(value)) yield return value;
}
}
anahtarı burada derleyici üretilmesi ile, bir yineleyici blok içine yöntemi döner "yield return
", olup numaralandırıcısı (IEnumerator<T>
) aynı şeyi yapar. çağrıldığında, genel tür çıkarsama otomatik T
kolları, böylece sadece ihtiyaç:
int[] data = {1,2,3,4,5};
var odd = data.Where(i=>i%2 != 0);
yukarıda gayet anonim türleri ile kullanılabilir. (Bu anonim değil sürece) isterseniz
Sen coure, T
belirtebilirsiniz:
var odd = data.Where<int>(i=>i%2 != 0);
Re IEnumerable
(genel olmayan), iyi, en basit yaklaşım içindir ilk olarak bir IEnumerable<T>
almak için .Cast<T>(...)
veya .OfType<T>(...)
'u kullanın. Yukarıdakiler için this IEnumerable
numarasından geçebilirsiniz, ancak arayan kişi, derleyicinin bunu çıkarmasından ziyade, T
belirtmelidir. Bunu, anonim bir tür olarak T
ile kullanamazsınız, bu nedenle buradaki ahlaki: anonim türlerle IEnumerable
'un jenerik olmayan formunu kullanmayın.
Yöntem imzasının, derleyicinin T
'u tanımlayamayacağı (ve elbette bunu anonim türler için belirtemezsiniz) olduğu biraz daha karmaşık senaryolar vardır. Bu durumlarda, genellikle derleyicisinin çıkarımı ile (belki de bir pass-thru yöntemiyle) kullanabileceği farklı bir imzayı yeniden hesaba katmak mümkündür, ancak burada bir yanıt sağlamak için gerçek kodu göndermeniz gerekir. Tartışmanın ardından
, burada anonim türleriyle Cast<T>
kaldıraç bir yolu. Anahtar, tür çıkarımında kullanılabilecek bir argüman sağlamaktır (argüman hiç kullanılmamış olsa bile). Örneğin:
static void Main()
{
IEnumerable data = new[] { new { Foo = "abc" }, new { Foo = "def" }, new { Foo = "ghi" } };
var typed = data.Cast(() => new { Foo = "never used" });
foreach (var item in typed)
{
Console.WriteLine(item.Foo);
}
}
// note that the template is not used, and we never need to pass one in...
public static IEnumerable<T> Cast<T>(this IEnumerable source, Func<T> template)
{
return Enumerable.Cast<T>(source);
}
Bu gönderi, size başlangıç için yardımcı olabilir: How do you write a C# Extension Method for a Generically Typed Class. Tam olarak aradığınız şey olup olmadığından emin değilim ama başlamanıza neden olabilir.
using System;
using System.Collections.Generic;
namespace ExtentionTest {
class Program {
static void Main(string[] args) {
List<int> BigList = new List<int>() { 1,2,3,4,5,11,12,13,14,15};
IEnumerable<int> Smalllist = BigList.MyMethod();
foreach (int v in Smalllist) {
Console.WriteLine(v);
}
}
}
static class EnumExtentions {
public static IEnumerable<T> MyMethod<T>(this IEnumerable<T> Container) {
int Count = 1;
foreach (T Element in Container) {
if ((Count++ % 2) == 0)
yield return Element;
}
}
}
}
Bu bir arabellek yineleyici; Bunun yerine, genellikle bir yineleyici bloğu kullanmak tercih edilir, yani "
(içerik için, orijinal sürümde
- 1. IEnumerable <IEnumerable <T>'den IEnumerable <T> alın
- 2. IEnumerable <int>
- 3. IEnumerable <T> parametresi
- 4. DataTables - IEnumerable <T>
- 5. Neden IEnumerable <T> IEnumerable öğesinden devralınır?
- 6. IEnumerable <T> .find oluştur()
- 7. linq: Ben bir IEnumerable <dizeye> dönüştürmek istediğiniz bir IEnumerable < çift > sahip yardımcı yöntemi
- 8. genel bir IEnumerable döndürüyor <T>
- 9. Bir IEnumerable üzerinde sayma <dynamic>
- 10. İki IEnumerable <T> yeni bir IEnumerable <T> içine nasıl bağlanır?
- 11. Bir CSV dosyasına IEnumerable <T>
- 12. Öğe <int> IEnumerable için <IComparable>
- 13. Generic IEnumerable <SelectListItem> uzantısı yöntemi nasıl yazılır
- 14. tek uzantı metodu <K, IEnumerable/IList/ıcollection <V>>
- 15. IEnumerable
- 16. IEnumerable
- 17. IEnumerable
- 18. IEnumerable
- 19. Nasıl IEnumerable <int> dönüştürebilirsiniz Int32
- 20. IEnumerable <T> .Last() Liste <T> için en iyi duruma getirilmiştir?
- 21. Nasıl Dönülür IEnumerable <T>
- 22. Varsayılan değeri nedir (IEnumerable <T>)?
- 23. Neden IEnumerable için bir Sum() uzantısı vardır <uint>
- 24. Neden String sınıfı IEnumerable <char> taşınabilir kütüphanede uygulamıyor?
- 25. IEnumerable bir çalışma ToList() nasıl?
- 26. Neden .net dizileri neden IEnumerable ve IEnumerable <T> değil?
- 27. Neden IEnumerable.Empty <T>() ve IEnumerable <T> .Empty()? Eğer T türünde boş IEnumerable oluşturmak istiyorsanız
- 28. Liste Sarıcı İçin IEnumerable <T> Uygula
- 29. Linq'i kullanmak için sınıf özelliklerini seçin IEnumerable <T>
- 30. IEnumerable <WebSocketHandler> 'ı WebSocketCollection' a dönüştürün
kullanılmayan bir parametre ile bir yöntem sadece yanlış geliyor. –
It * is * sadece derleyici tarafından, çalışma zamanı değil; - –
Kullanılır, ve açıkça değil, daha doğrusu anlaşılır ... C# derleyicisi "çok akıllı" olsaydık açıkça belirtmek zorunda kalmak. –