2012-07-13 49 views
7

Tôi có một Dictionary<string,int> dictionary1 và tôi cần phải chuyển đổi nó thành một nơi List<Data>Data có các thuộc tính lable = dictionary1.key và value = dictionary1.value. Tôi không muốn sử dụng một vòng lặp for/foreach (được viết bởi chính tôi) bởi vì để tránh nó, tôi đang cố gắng sử dụng một từ điển.'Chuyển đổi' từ điển <string,int> vào Danh sách <object>

Một tùy chọn khác sẽ có hai từ điển khác nhau (dictionary2 và dictionary3) trong đó dictionary2<string,keyOfDictionary1>dictionary3<string,valueOfDictionary1>.

Tôi có ý nghĩa không? Điều đó có thể không? Có lựa chọn nào tốt hơn không?

+6

"không muốn sử dụng vòng lặp" sẽ khó khăn. Bạn sẽ _have_ để lặp lại từ điển _somehow_. –

+2

Bạn đang nhận được khá nhiều câu trả lời 'LINQ' - chỉ cần lưu ý rằng thư viện' LINQ' về cơ bản vẫn chạy 'foreach' để trả lại kết quả. – Oded

+0

Bạn nghĩ linq hoạt động như thế nào? – Jodrell

Trả lời

12

Giả sử:

class Data 
{ 
    public string Label { get; set; } 

    public int Value { get; set; } 
} 

Sau đó:

Dictionary<string, int> dic; 
List<Data> list = dic.Select(p => new Data { Label = p.Key, Value = p.Value }).ToList(); 
5

Có lẽ bạn có thể sử dụng LINQ? Tuy nhiên

dictionary1.Select(p => new Data(p.Key, p.Value)).ToList() 

này được sử dụng yield và do đó vòng trong nền ...

+2

điều này sẽ yêu cầu 'Dữ liệu' để có một hàm tạo lấy giá trị làm tham số, không được chỉ định trong câu hỏi. –

+0

@ ErenErsönmez Có, nhưng đó là một vấn đề tầm thường để làm cho nó khởi tạo nội tuyến nếu đó là những gì anh ta cần. Tôi chỉ ra một kỹ thuật chứ không phải là một giải pháp copy-paste-ready! – Leonard

4
myDictionary.Select(x => new Data(){ label = x.Key, value = x.Value).ToList(); 
0
public class Data 
    { 
     public string Key { get; set; } 

     public int Value { get; set; } 
    } 

    private static void Main(string[] args) 
    { 
     Dictionary<string, int> dictionary1 = new Dictionary<string, int>(); 
     dictionary1.Add("key1", 1); 
     dictionary1.Add("key2", 2); 

     List<Data> data = dictionary1.Select(z => new Data { Key = z.Key, Value = z.Value }).ToList(); 

     Console.ReadLine(); 
    } 
1

Hãy thử

dictionary1.Select(p => new Data(p.Key, p.Value)).ToList(); 
2

tôi cho rằng "không có vòng lặp" thực sự có nghĩa là "tôi muốn LINQ":

List<Data> = dictionary1.Select(
    pair => new Data() { 
     label = pair.Key, 
     value = pair.Value 
    })).ToList(); 
1

NET đã có một kiểu dữ liệu mà những gì Data sẽ làm gì: KeyValuePair<T1,T2>. Từ điển đã thực hiện IEnumerable<KeyValuePair<T1,T2>>, chỉ cần truyền tới nó.

Dictionary<string, int> blah = new Dictionary<string, int>(); 
IEnumerable<KeyValuePair<string, int>> foo = blah; 
+0

Thật đơn giản. Nếu không hiểu nhu cầu của OP, chúng tôi không thể biết nếu nó thực sự không cần phải phức tạp hơn thế này. :) –

+0

Tôi đồng ý rằng nó sẽ không đáp ứng nhu cầu nếu 'Key' * hoàn toàn * phải được đổi tên thành' Nhãn'. Nhưng đây là cách duy nhất để tránh lặp AFAIK. Tuy nhiên, ngay cả diễn viên cũng là vô nghĩa. OP chỉ có thể sử dụng từ điển bất cứ nơi nào họ cần một IEnumerable. –

+0

Rất tiếc, tôi cần đổi tên dữ liệu của mình thành Nhãn. Tôi đã thử làm điều này nhưng tôi sẽ có điều tương tự như bạn nói. Vì vậy, cảm ơn rất nhiều vì sự giúp đỡ và tôi xin lỗi vì tôi đã tạo ra những thông tin sai lầm bằng cách không nói rõ ràng rằng tôi không muốn viết một vòng for/foreach vì tôi biết rằng các hàm dựng sẵn sẽ làm điều đó cho tôi tốt hơn cách (ngay cả khi một vòng lặp trong nền là cần thiết). – Jenninha

1

Đây là một bài cũ, nhưng chỉ gửi để giúp người khác;)

Ví dụ để chuyển đổi bất kỳ loại đối tượng:

public List<T> Select<T>(string filterParam) 
{  
    DataTable dataTable = new DataTable() 

    //{... implement filter to fill dataTable } 

    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
    Dictionary<string, object> row; 

    foreach (DataRow dr in dataTable.Rows) 
    { 
     row = new Dictionary<string, object>(); 
     foreach (DataColumn col in dataTable.Columns) 
     { 
      row.Add(col.ColumnName, dr[col]); 
     } 
     rows.Add(row); 
    } 

    string json = new JavaScriptSerializer().Serialize(rows); 

    using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
    { 
     DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T[])); 
     var tick = (T[])deserializer.ReadObject(stream); 
     return tick.ToList(); 
    } 
} 
0

Chỉ trong trường hợp chỉ giúp bất cứ ai, tôi đã làm nó như thế này - sẽ xử lý các đối tượng phức tạp hơn một loại giá trị duy nhất, như được nêu trong OP.

// Assumes: Dictionary<string, MyObject> MyDictionary; 
List<MyObject> list = new List<MyObject>(); 
list.AddRange(MyDictionary.Values.ToArray()); 
Các vấn đề liên quan