Chuyển đổi các giá trị từ điển thành mảng


81

Cách hiệu quả nhất để chuyển danh sách các giá trị của từ điển thành một mảng là gì?

Ví dụ, nếu tôi có một Dictionarynơi KeyStringValueFoo, tôi muốn nhận đượcFoo[]

Tôi đang sử dụng VS 2005, C # 2.0

Câu trả lời:


125
// dict is Dictionary<string, Foo>

Foo[] foos = new Foo[dict.Count];
dict.Values.CopyTo(foos, 0);

// or in C# 3.0:
var foos = dict.Values.ToArray();

Phần mở rộng .ToArray <Foo> () có hoạt động tốt hơn không?
Goran

nhưng làm thế nào để chúng ta biết rằng nó là hiệu quả nhất?
Tom Carter

2
@Tom Tôi thường cho rằng bất cứ thứ gì được tích hợp vào khung công tác (như .CopyTo () hoặc .ToArray ()) là cách hiệu quả nhất để làm điều đó. Các Microsofties thông minh hơn tôi. :)
Matt Hamilton

5
ToArray kém hiệu suất hơn CopyTo (nó sử dụng CopyTo để sao chép vào một đại diện trung gian bên trong, sau đó Sao chép lại để trả lại). Tuy nhiên, như với tất cả các vấn đề liên quan đến hiệu suất vi mô là tính dễ đọc, tính mạnh mẽ và khả năng bảo trì và đo lường hiệu suất nếu đó là một vấn đề.
ICR

16
ToArray () là một phương pháp mở rộng trong LINQ, vì vậy bạn cần phải thêmusing System.Linq;
Christian Daven

12

Lưu trữ nó trong một danh sách. Nó dễ hơn;

List<Foo> arr = new List<Foo>(dict.Values);

Tất nhiên nếu bạn đặc biệt muốn nó trong một mảng;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();

6

Có một hàm ToArray () trên Giá trị:

Foo[] arr = new Foo[dict.Count];    
dict.Values.CopyTo(arr, 0);

Nhưng tôi không nghĩ rằng nó hiệu quả (tôi chưa thực sự thử, nhưng tôi đoán nó sao chép tất cả các giá trị này vào mảng). Bạn có thực sự cần một Mảng không? Nếu không, tôi sẽ cố gắng vượt qua IEnumerable:

IEnumerable<Foo> foos = dict.Values;

4

Nếu bạn muốn sử dụng linq, bạn có thể thử các bước sau:

Dictionary<string, object> dict = new Dictionary<string, object>();
var arr = dict.Select(z => z.Value).ToArray();

Tôi không biết cái nào nhanh hơn hoặc tốt hơn. Cả hai đều làm việc cho tôi.


2
dict.Values.ToArray()thực hiện điều tương tự, nhưng không có chi phí cụ thể hóa từng giá trị thông qua một đại biểu.
BACON

1

Ngày nay, khi bạn có sẵn LINQ, bạn có thể chuyển đổi các khóa từ điển và giá trị của chúng thành một chuỗi duy nhất.

Bạn có thể sử dụng mã sau:

// convert the dictionary to an array of strings
string[] strArray = dict.Select(x => ("Key: " + x.Key + ", Value: " + x.Value)).ToArray();

// convert a string array to a single string
string result = String.Join(", ", strArray);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.