2015-08-18 20 views
5

ben web formları bu kodu vardır: Ben hatayı olsun bu kod derleme yaparkenUzatma yöntemi olmayan bir jenerik statik sınıfında tanımlanmış olmalıdır

namespace TrendsTwitterati 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      List<TweetEntity> tweetEntity = tt.GetTweetEntity(1, "") 
       .DistinctBy(e => e.EntityPicURL); 
     } 

     public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
      this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
     { 
      HashSet<TKey> seenKeys = new HashSet<TKey>(); 
      foreach (TSource element in source) 
      { 
       if (seenKeys.Add(keySelector(element))) 
       { 
        yield return element; 
       } 
      } 
     } 
    } 
} 

Uzatma yöntemi tanımlanması gerekir jenerik olmayan bir statik sınıfta.

sorum ben statik bu kısmi sınıfını değiştiremezsiniz

  1. olduğunu. Aynısını ben olmadan nasıl başaracağım?
+2

İçinde 'DistinctBy 'yöntemiyle ayrı bir statik sınıf oluşturun. –

+2

Küme düzenine bakarak, uzantı yönteminizin hiç bir sınıfta olmadığı anlaşılıyor. Yani sadece kendi statik sınıfına koyma meselesi. – BoltClock

cevap

6

içindeki Uzantınızın yöntemleri yeni static sınıfını ekleyin ve tanımlamak kullanın. Uzantı yöntemleri için MSDN documentation'a bakın.

namespace TrendsTwitterati 
{ 
    public partial class Default: System.Web.UI.Page 
    { 

    } 

    public static class MyExtensions 
    { 
     public static IEnumerable <TSource> DistinctBy < TSource, TKey > (this IEnumerable <TSource> source, Func < TSource, TKey > keySelector) 
     { 
      HashSet <TKey> seenKeys = new HashSet <TKey>(); 
      foreach(TSource element in source) 
      { 
       if (seenKeys.Add(keySelector(element))) 
       { 
        yield 
        return element; 
       } 
      } 
     } 
    } 
} 
+1

İç statik sınıf ile güzel bir hile, ama önce neye baktığımı hiçbir fikrim yoktu Köşeli parantezler ve tipler arasındaki boşluklar. –

+1

çalıştı, teşekkürler – Venkat

5

Şimdi bu şekilde

namespace TrendsTwitterati 
{ 
    public static class Extension 
    { 
     public static IEnumerable<TSource> DistinctBy<TSource, TKey> 
      (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
      { 
       HashSet<TKey> seenKeys = new HashSet<TKey>(); 
       foreach (TSource element in source) 
       { 
        if (seenKeys.Add(keySelector(element))) 
        { 
         yield return element; 
        } 
       } 
      } 
    } 
} 

uzatma yöntemi için static sınıfa senin yöntemi ekleyin o

namespace TrendsTwitterati 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
      protected void Page_Load(object sender, EventArgs e) 
      { 
       List<TweetEntity> tweetEntity = tt.GetTweetEntity(1, "").DistinctBy(e => e.EntityPicURL); 
      } 
    } 
} 
+0

Bunu page_load işlevinden nasıl arayabilirim? – Venkat

+1

@Venkat: Bunu, genişletmekte olduğunuz türde başka herhangi bir örnek yöntemi olarak adlandırın. “Uzantı” sınıfının bulunduğu isim alanına başvurmanız gerekir, ancak hiçbir zaman “Uzantının” kendisine başvurmak zorunda kalmazsınız. – BoltClock

+0

anladı. Şimdi bu şekilde bir hata alıyorum. Hata 'System.Collections.Generic.IEnumerable ' öğesini örtülü olarak 'System.Collections.Generic.List ' olarak değiştiremezsiniz. Açık bir dönüşüm var (bir dökümün eksik mi?) – Venkat

İlgili konular