2009-08-15 29 views
5

Tôi đang cố gắng tạo một phương thức mở rộng sẽ trộn nội dung của một bộ sưu tập danh sách chung bất kể loại của nó, tuy nhiên, không chắc chắn nên đặt gì ở giữa < .. > làm tham số. tôi có đặt đồ vật không? hoặc Loại? Tôi muốn có thể sử dụng điều này trên bất kỳ bộ sưu tập Danh sách nào mà tôi có.Làm thế nào để xác định tham số cho phương thức mở rộng kiểu danh sách chung trong C#

Cảm ơn!

public static void Shuffle(this List<???????> source) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < source.Count; i++) 
    { 
     int index = rnd.Next(0, source.Count); 
     object o = source[0]; 

     source.RemoveAt(0); 
     source.Insert(index, o); 
    } 
} 

Trả lời

11

Bạn cần phải làm cho nó một phương pháp chung:

public static void Shuffle<T>(this List<T> source) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < source.Count; i++) 
    { 
     int index = rnd.Next(0, source.Count); 
     T o = source[0]; 

     source.RemoveAt(0); 
     source.Insert(index, o); 
    } 
} 

Điều đó sẽ cho phép nó để làm việc với bất kỳ List<T>.

+4

Tôi phải học cách nhập nhanh hơn. Dù sao, 'IList ' sẽ tổng quát hơn. –

+0

khi tôi thử tất cả các phương pháp được liệt kê tôi nhận được ... Đối số '2': không thể chuyển đổi từ 'đối tượng' sang 'T' – Grant

+2

@Grant: Bạn cần thay đổi phần ở giữa để sử dụng "T" thay vì "đối tượng "(hoặc thêm một diễn viên). Như John đã đề cập, việc sử dụng IList sẽ tổng quát hơn, mặc dù không phải tất cả IList đều thực hiện chèn, do đó, nó có thể không hoạt động bình thường. –

4

Bạn chỉ cần thực hiện phương pháp riêng của bạn chung chung:

public static void Shuffle<T>(this List<T> source) 
3

Hơi lạc đề, nhưng một Fisher-Yates shuffle sẽ có ít thiên vị và hiệu suất tốt hơn so với phương pháp của bạn:

public static void ShuffleInPlace<T>(this IList<T> source) 
{ 
    if (source == null) throw new ArgumentNullException("source"); 

    var rng = new Random(); 

    for (int i = 0; i < source.Count - 1; i++) 
    { 
     int j = rng.Next(i, source.Count); 

     T temp = source[j]; 
     source[j] = source[i]; 
     source[i] = temp; 
    } 
} 
0

Tôi nghĩ giải pháp này nhanh hơn để xử lý, bởi vì bạn sẽ nhận được itens ngẫu nhiên và vị trí bộ sưu tập của bạn sẽ được bảo tồn để sử dụng trong tương lai.

namespace MyNamespace 
{ 
    public static class MyExtensions 
    { 
     public static T GetRandom<T>(this List<T> source) 
     { 
      Random rnd = new Random(); 
      int index = rnd.Next(0, source.Count); 
      T o = source[index]; 
      return o; 
     } 
    } 
} 

bước:

  1. Tạo Class tĩnh của bạn để xác định phần mở rộng của bạn
  2. Tạo bạn Phương pháp mở rộng (phải tĩnh)
  3. Process dữ liệu của bạn.
Các vấn đề liên quan