2015-08-18 20 views
5

Tôi có mã này trong các hình thức web:phương pháp mở rộng phải được định nghĩa trong một lớp tĩnh phi generic

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; 
       } 
      } 
     } 
    } 
} 

Khi tôi biên dịch mã này tôi nhận được lỗi

phương pháp mở rộng phải được xác định trong một lớp tĩnh không chung chung.

Câu hỏi của tôi là

  1. tôi không thể thay đổi partial class này để tĩnh. Làm thế nào tôi sẽ hoàn thành cùng một mà không có nó?
+2

Tạo lớp tĩnh riêng biệt bằng phương pháp 'DistinctBy' trong đó. –

+2

Đánh giá bởi bố cục cú đúp, có vẻ như phương thức mở rộng của bạn không thực sự ở bất kỳ lớp nào. Vì vậy, nó chỉ là vấn đề đặt nó trong lớp tĩnh của riêng nó. – BoltClock

Trả lời

6

Thêm lớp mới static và xác định phương pháp mở rộng của bạn bên trong nó. Hãy xem MSDN documentation để biết Phương thức mở rộng.

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

Bí quyết đẹp với lớp tĩnh bên trong, nhưng tôi không biết mình đang xem gì lúc đầu với khoảng cách giữa các dấu ngoặc nhọn và các loại. –

+1

nó hoạt động nhờ – Venkat

5

Thêm phương pháp của bạn vào static lớp cho phương pháp khuyến nông theo cách này

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; 
        } 
       } 
      } 
    } 
} 

Bây giờ sử dụng nó

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

Tôi sẽ gọi điều này từ chức năng page_load như thế nào? – Venkat

+1

@Venkat: Bạn chỉ cần gọi nó giống như bất kỳ phương pháp thể hiện nào khác trên loại bạn đang mở rộng. Bạn phải tham chiếu không gian tên nơi lớp 'Extension' cư trú, nhưng bạn không bao giờ phải tham chiếu' Extension'. – BoltClock

+0

. Bây giờ tôi nhận được một lỗi theo cách này. Lỗi Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.IEnumerable ' thành 'System.Collections.Generic.List '. Một chuyển đổi rõ ràng tồn tại (bạn đang bỏ lỡ một diễn viên?) – Venkat

Các vấn đề liên quan