2012-03-05 28 views
15

thể trùng lặp:
Custom Collection InitializersTạo từ điển theo phong cách bộ sưu tập initializer trên lớp tùy chỉnh

Tôi có một lớp Pair đơn giản:

public class Pair<T1, T2> 
    { 
     public Pair(T1 value1, T2 value2) 
     { 
      Value1 = value1; 
      Value2 = value2; 
     } 

     public T1 Value1 { get; set; } 
     public T2 Value2 { get; set; } 
    } 

Và muốn để có thể để xác định nó như một đối tượng Từ điển, tất cả nội tuyến như sau:

var temp = new Pair<int, string>[] 
     { 
      {0, "bob"}, 
      {1, "phil"}, 
      {0, "nick"} 
     }; 

Nhưng yêu cầu tôi xác định một cặp hoàn toàn mới (0, "bob") v.v., tôi sẽ triển khai điều này như thế nào?

Như thường lệ, cảm ơn các bạn!

+0

Câu hỏi hay! Tôi đã chỉnh sửa câu trả lời của bạn để sử dụng thuật ngữ chính xác (bộ khởi tạo bộ sưu tập). Điều này thường được thực hiện ở phía bộ sưu tập của mọi thứ (nó phải có một phương thức Add()). Trong trường hợp này, bạn đang sử dụng một mảng để nó không hoạt động theo cùng một cách. Nhưng rất quan tâm để xem nếu có những cách để làm cho nó hoạt động! – MattDavey

+0

Không phải là một fan hâm mộ của 'KeyValuePair '? Hoặc đi cho những kiến ​​thức áp dụng? –

Trả lời

17

Để có được khởi tạo tùy chỉnh để làm việc như từ điển bạn cần hỗ trợ hai điều. Loại của bạn cần triển khai IEnumerable và có phương thức Add thích hợp. Bạn đang khởi tạo một số Array, không có phương thức Add. Ví dụ

class PairList<T1, T2> : IEnumerable 
{ 
    private List<Pair<T1, T2>> _list = new List<Pair<T1, T2>>(); 

    public void Add(T1 arg1, T2 arg2) 
    { 
     _list.Add(new Pair<T1, T2>(arg1, arg2)); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 
} 

và sau đó bạn có thể làm

var temp = new PairList<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 
+0

Bạn có gợi ý rằng 'int [] nums = {1, 2, 3};' không hợp lệ C#? bởi vì nó là ... Chắc chắn vấn đề là Cặp không có phương pháp Thêm? – Chris

+0

@ Chris Điều đó không giống như từ điển. –

+0

Vâng, tìm kiếm thêm tôi thấy vấn đề ở đâu. Tôi đã nghĩ rằng vì cú pháp hoạt động như trong bình luận của tôi rằng vấn đề là với việc tạo ra đối tượng Pair. Khi nhìn vào nhiều thứ hơn (và cố gắng viết mã hợp lệ để làm điều này), tôi nhận ra rằng cú pháp được sử dụng bởi bài viết gốc đang cố gắng gọi Add (1, "bob") trên mảng đó là những gì bạn đang nói doesn ' t tồn tại. Xin lỗi về điều đó, tôi sẽ để lại bình luận cho kẻ ngốc nghèo tiếp theo nghĩ như tôi. :) – Chris

6

Tại sao không sử dụng lớp thừa kế từ Dictionary?

public class PairDictionary : Dictionary<int, string> 
{ 
} 

private static void Main(string[] args) 
{ 
    var temp = new PairDictionary 
    { 
     {0, "bob"}, 
     {1, "phil"}, 
     {2, "nick"} 
    }; 

    Console.ReadKey(); 
} 

Bạn cũng có thể tạo ra bộ sưu tập của riêng bạn (tôi nghi ngờ nó là trường hợp bởi vì bạn có cùng Value1 cho hai mục, vì vậy T1 không đóng vai trò như một chìa khóa trong ví dụ của bạn) mà không kế thừa từ Dictionary .

Nếu bạn muốn sử dụng các cú pháp đường thu initializer, bạn sẽ phải cung cấp một phương pháp Add mà mất 2 đối số (T1T2intstring trong trường hợp của bạn).

public void Add(int value1, string value2) 
{ 
} 

Xem Custom Collection Initializers

0

Cú pháp bạn đang tìm kiếm không được cung cấp bởi các đối tượng đang được sử dụng với từ điển, nó là bộ sưu tập từ điển riêng của mình. Nếu bạn cần có thể sử dụng bộ khởi tạo bộ sưu tập thì bạn sẽ cần sử dụng bộ sưu tập hiện có (như Từ điển) hoặc triển khai bộ sưu tập tùy chỉnh để chứa bộ sưu tập đó.

Nếu không, bạn đang cơ bản giới hạn:

var temp = new Pair<int, string>[] 
    { 
     new Pair(0, "bob"), 
     new Pair(1, "phil"), 
     new Pair(0, "nick") 
    }; 
2
public class Paircollection<T1, T2> : List<Pair<T1, T2>> 
{ 
    public void Add(T1 value1, T2 value2) 
    { 
     Add(new Pair<T1, T2>(value1, value2)); 
    } 
} 

và sau đó

var temp = new Paircollection<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 

sẽ làm việc. Về cơ bản, bạn chỉ cần tạo phiên bản List<Pair<T1,T2>> để biết cách thực hiện quyền Thêm mọi thứ.

Điều này rõ ràng là có thể mở rộng đối với bất kỳ lớp nào khác ngoài Cặp (theo cách mà các giải pháp từ điển không có).

Nhờ Yuriy Faktorovich đã giúp tôi với sự hiểu biết ban đầu của tôi và câu hỏi được liên kết để chỉ cho tôi đúng hướng.

+1

Xin lỗi bạn là người theo dõi, nhưng bạn không cần 'foo', bạn không bao giờ sử dụng nó. –

+0

Hàng rào được phê duyệt và sửa chữa. Đó là một sự nôn nao khi tôi đang sử dụng một danh sách như một thành viên chứ không phải là kế thừa. :) – Chris

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