2008-09-24 19 views
16

Tôi hiện đang khởi tạo một Hashtable theo cách sau:Có cách nào tốt hơn để khởi tạo một Hastable trong .NET mà không cần sử dụng phương thức Add?

Hashtable filter = new Hashtable(); 
filter.Add("building", "A-51"); 
filter.Add("apartment", "210"); 

Tôi đang tìm kiếm một cách đẹp hơn để làm điều này.

tôi đã cố gắng một cái gì đó giống như

Hashtable filter2 = new Hashtable() { 
    {"building", "A-51"}, 
    {"apartment", "210"} 
}; 

Tuy nhiên các mã trên không biên dịch.

Trả lời

25

mã chính xác mà bạn đăng tải:

 Hashtable filter2 = new Hashtable() 
     { 
      {"building", "A-51"}, 
      {"apartment", "210"} 
     }; 

biên dịch một cách hoàn hảo trong C# 3. đưa cho bạn báo cáo vấn đề biên soạn, tôi đoán bạn đang sử dụng C# 2? Trong trường hợp này, bạn ít nhất có thể làm điều này:

 Hashtable filter2 = new Hashtable(); 
     filter2["building"] = "A-51"; 
     filter2["apartment"] = "210"; 
9

Trong C# 3 nó sẽ biên dịch tốt như thế này:

Hashtable table = new Hashtable {{1, 1}, {2, 2}}; 
+0

Đối với bộ khởi tạo đối tượng, dấu gạch ngang Constructor là tùy chọn? –

+0

nếu bạn có một ctor trống, ya – mattlant

0

(Không phải là một C# chuyên gia)

Đây là cú pháp đường, và nếu nó là cú pháp đường tôi muốn có các bản đồ (trong một Hashtable) tốt đẹp và rõ ràng:

 

Hashtable filter2 = new Hashtable() { "building" => "A-51", "apartment" => "210"}; 

Tuy nhiên tôi không thấy một nhu cầu thực sự cho điều này, không có nhiều sai với chỉ cần gọi thêm sau khi khởi tạo.

(Tôi đã biết mọi người xung đột với trình biên dịch Java để đạt được những điều tương tự trong quá khứ đối với Java (điều này đã khiến cho các vấn đề lớn chuyển sang Java 5 vài năm sau), tôi hy vọng đây không phải là một lựa chọn cho C# mặc dù)

+0

Có một lưu ý nếu bạn cần thêm nội tuyến: someclass.AddTable (new HashTable {{1, "A"}, {2, "b"}}); – mattlant

0

Tôi nghĩ rằng câu hỏi thực sự được yêu cầu có thể về nhà xây dựng có thể tưởng tượng như:

Hashtable ht = new Hashtable (myArray); // điền vào mảng

HashTable ht = new HashTable (MyDataTable); // điền từ datatable

AFAIK, câu trả lời là "không", nhưng bạn có thể tự viết nó. Tôi cho rằng lý do mà các phương thức đó không có trong thư viện là Array hoặc DataTable phải được định dạng đúng. Nó không phải là một mất mát lớn kể từ khi thực hiện bất kỳ phương pháp này có lẽ sẽ được sử dụng phương pháp Thêm trong một vòng lặp anyway.

+0

Trình khởi tạo đối tượng khi áp phích được đăng là một phần của đặc tả ngôn ngữ C# 3. Trình biên dịch lấy mã và biên dịch nó thành Thêm cuộc gọi. Khá nhiều lớp có phương thức bổ sung (thực thi IEnumerable) có thể được khởi tạo theo cách này. – mattlant

0

Tôi không có ý tưởng trong C# 3.0 Hashtable table = new Hashtable {{1, 1}, {2, 2}}; sẽ biên dịch.

Dù sao, thực hiện kém của con người:

Meh, bạn có thể mở rộng các lớp Hashtable:

class MyHashTable : System.Collections.Hashtable  
{ 
    public MyHashTable(string [,] values) 
    { 
     for (int i = 0; i < (values.Length)/2; i++) 
     { 
      this.Add(values[i,0], values[i,1]); 
     } 
    } 
} 

Và sau đó từ một ứng dụng Console:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[,] initialize = { { "building", "A-51" }, { "apartment", "210" }, {"wow", "nerf Druids"}}; 



     MyHashTable myhashTable = new MyHashTable(initialize); 
     Console.WriteLine(myhashTable["building"].ToString()); 
     Console.WriteLine(myhashTable["apartment"].ToString()); 
     Console.WriteLine(myhashTable["wow"].ToString()); 
     Console.ReadKey(); 


    } 
} 

sẽ cho kết quả:
A-51
nerf Druids

việc này được thực hiện nhanh chóng để có thể đánh bom trong một số tình huống nhất định nhưng sau đó lại một lần nữa ..

+0

có thể là đối tượng [,]? vì bạn có thể sử dụng bất kỳ đối tượng (không thay đổi) nào làm khóa Hashtable, không chỉ các chuỗi. Và btw, drus đã thấy đủ nerfing :) Mages quá;) (từ chối trách nhiệm: không-do-mage mage :)) –

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