2009-09-01 37 views
10

Đơn giản. Nếu tôi sử dụng:Sử dụng cặp khóa-giá trị làm tham số

public void Add(params int[] values) 

Sau đó, tôi có thể sử dụng điều này như:

Add(1, 2, 3, 4); 

Nhưng bây giờ tôi đang đối phó với cặp khóa-giá trị! Tôi có một lớp KeyValue để liên kết một số nguyên với một giá trị chuỗi. Vì vậy, tôi bắt đầu với:

public void Add(params KeyValue[] values) 

Nhưng tôi không thể sử dụng này:

Add(1, "A", 2, "B", 3, "C", 4, "D"); 

Thay vào đó, tôi buộc phải sử dụng:

Add(new KeyValue(1, "A"), new KeyValue(2, "B"), new KeyValue(3, "C"), new KeyValue(4, "D")); 

Ewww ... Đã Tôi không thích này ...

Vì vậy, ngay bây giờ tôi sử dụng hàm Thêm mà không có công cụ sửa đổi thông số và chỉ chuyển một mảng được xác định trước cho hàm này. Vì nó chỉ được sử dụng cho một khởi tạo nhanh chóng cho một bài kiểm tra, tôi không quá nhiều rắc rối về việc cần thêm mã này, mặc dù tôi muốn giữ cho mã đơn giản để đọc. Tôi rất muốn biết một mẹo để sử dụng phương pháp tôi không thể sử dụng nhưng có cách nào để thực hiện điều này mà không sử dụng cấu trúc "KeyValue() mới" không?

+7

Bạn biết đã có 'KeyValuePair '? –

+0

Vâng, tôi biết. :-) Đó là loại tôi sử dụng ... –

Trả lời

23

Nếu bạn chấp nhận một IDictionary<int,string>, bạn có lẽ có thể sử dụng (trong C# 3.0, ít nhất):

Add(new Dictionary<int,string> { 
    {1, "A"}, {2, "B"}, {3, "C"}, {4, "D"} 
}); 

Bất kỳ sử dụng?

Ví dụ Add:

static void Add(IDictionary<int, string> data) { 
    foreach (var pair in data) { 
     Console.WriteLine(pair.Key + " = " + pair.Value); 
    } 
} 
+0

Có vẻ tốt! Nó giữ mọi thứ trong một dòng. –

+0

Bạn cũng có thể sử dụng loại bí danh nếu bạn không muốn loại bỏ toàn bộ loại từ điển chung 'sử dụng cặp = System.Collections.Generic.Dictionary ;' và sau đó sử dụng như 'Thêm (cặp mới { {1," A "}, {2," B "}, {3," C "}, {4," D "} });' hơi neater. –

0

Bạn có thể sử dụng giống như sau với nhược điểm rõ ràng rằng bạn mất gõ mạnh.

public void Add(params Object[] inputs) 
{ 
    Int32 numberPairs = inputs.Length/2; 

    KeyValue[] keyValues = new KeyValue[numberPairs]; 

    for (Int32 i = 0; i < numberPairs; i++) 
    { 
     Int32 key = (Int32)inputs[2 * i]; 
     String value = (String)inputs[2 * i + 1]; 

     keyvalues[i] = new KeyValue(key, value); 
    } 

    // Call the overloaded method accepting KeyValue[]. 
    this.Add(keyValues); 
} 

public void Add(params KeyValue[] values) 
{ 
    // Do work here. 
} 

Bạn nên thêm một số lỗi xử lý nếu đối số không đúng loại. Không thông minh, nhưng nó sẽ hoạt động.

3

Bạn có thể sửa đổi thiết kế lớp hiện tại của mình, nhưng bạn sẽ cần phải thêm generics và sử dụng giao diện IEnumerable.

class KeyValue<TKey, TValue> 
    { 
     public KeyValue() 
     { 
     } 
    } 

    // 1. change: need to implement IEnumerable interface 
    class KeyValueList<TKey, TValue> : IEnumerable<TKey> 
    { 
     // 2. prerequisite: parameterless constructor needed 
     public KeyValueList() 
     { 
      // ... 
     } 

     // 3. need Add method to take advantage of 
     // so called "collection initializers" 
     public void Add(TKey key, TValue value) 
     { 
      // here you will need to initalize the 
      // KeyValue object and add it 
     } 

     // need to implement IEnumerable<TKey> here! 
    } 

Sau những bổ sung bạn có thể làm như sau:

new KeyValueList<int, string>() { { 1, "A" }, { 2, "B" } }; 

Trình biên dịch sẽ sử dụng giao diện IEnumerable và phương thức Add để cư KeyValueList. Lưu ý rằng nó hoạt động cho C# 3.0.

Nếu bạn đang sử dụng tính năng này để kiểm tra, những thay đổi này không đáng giá. Đó là một nỗ lực khá lớn và bạn thay đổi khá nhiều mã sản xuất để thử nghiệm.

+1

Kế thừa từ 'Danh sách >' và thêm tùy chỉnh 'Thêm' sẽ là tuyến đường dễ nhất ở đây. –

+0

@Marc: Ý tưởng hay. Đã không nghĩ về điều đó. –

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