2012-07-13 21 views
7

में शब्दकोश 'कन्वर्ट' मैं एक Dictionary<string,int> dictionary1 है और मैं इसे एक List<Data> जहां Data गुण lable = dictionary1.key और value = dictionary1.value है में परिवर्तित करने की जरूरत है। मैं एक फॉरवर्ड/फोरैच लूप (स्वयं द्वारा लिखित) का उपयोग नहीं करना चाहता क्योंकि इसे टालने के लिए मैं एक शब्दकोश का उपयोग करने की कोशिश कर रहा हूं। सूची <object>

एक और विकल्प में दो अलग-अलग शब्दकोश (शब्दकोश 2 और शब्दकोश 3) होंगे जहां dictionary2<string,keyOfDictionary1> और dictionary3<string,valueOfDictionary1> होगा।

क्या मुझे समझ में आता है? क्या यह संभव है? क्या कोई बेहतर विकल्प है?

+6

"लूप का उपयोग नहीं करना चाहते हैं" मुश्किल हो रहा है। आप _have_ को शब्दकोश _somehow_ को फिर से करने के लिए जा रहे हैं। –

+2

आपको बहुत से 'LINQ' उत्तरों मिल रहे हैं - केवल यह जान लें कि परिणाम लौटने के लिए' LINQ' लाइब्रेरी अभी भी अनिवार्य रूप से 'foreach' चलाती है। – Oded

+0

आपको लगता है कि linq कैसे काम करता है? – Jodrell

उत्तर

12

उपयोग कर रहा है मान लिया जाये कि:

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

    public int Value { get; set; } 
} 

तब:

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

शायद आप LINQ का उपयोग कर सकते हैं?

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

हालांकि यह yield है और इस तरह की पृष्ठभूमि में लूप ...

+2

इसके लिए 'डेटा' की आवश्यकता होगी जो एक कन्स्ट्रक्टर है जो मूल्यों को पैरामीटर के रूप में लेता है, जो प्रश्न में निर्दिष्ट नहीं है। –

+0

@ ErenErsönmez हां, लेकिन अगर यह आवश्यक है तो इसे इनलाइन प्रारंभ करने के लिए एक मामूली मामला है। मैं कॉपी-पेस्ट-तैयार समाधान की बजाय एक तकनीक को इंगित कर रहा हूं! – 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

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

मुझे लगता है "कोई पाश" वास्तव में इसका मतलब है कि "मैं चाहता हूँ LINQ" का प्रयास करें: KeyValuePair<T1,T2>:

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

नेट पहले से ही Data करना होगा क्या करता है कि एक डेटा प्रकार है। शब्दकोश पहले से ही IEnumerable<KeyValuePair<T1,T2>> लागू करता है, बस इसे डाला गया। ;

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

शानदार ढंग से सरल। ओपी की जरूरतों को समझने के बिना, हम नहीं जानते कि क्या इससे वास्तव में इससे अधिक जटिल होने की आवश्यकता नहीं है। :) –

+0

मैं मानता हूं कि यदि 'कुंजी' * बिल्कुल * का नाम बदलकर 'लेबल'' किया जाना चाहिए तो यह ज़रूरतों को पूरा नहीं करेगा। लेकिन यह AFAIK लूपिंग से बचने का एकमात्र तरीका है। हालांकि, यहां तक ​​कि कास्ट व्यर्थ है। ओपी सिर्फ उस शब्दकोश का उपयोग कर सकता है जहां उन्हें एक आईनेमेरेबल की आवश्यकता होती है। –

+0

दुर्भाग्यवश मुझे लेबल में अपने डेटा का नाम बदलने की आवश्यकता थी। मैंने ऐसा करने की कोशिश की लेकिन मेरे पास वही बात होगी जैसा आपने कहा था। तो, मदद के लिए बहुत बहुत धन्यवाद और मुझे खेद है कि मैंने गलतफहमी से उत्पन्न नहीं किया है कि मैं स्पष्ट रूप से कहता हूं कि मैं खुद के लिए/foreach loop लिखना नहीं चाहता था क्योंकि मुझे पता था कि अंतर्निहित कार्य मेरे लिए बेहतर तरीके से करेंगे रास्ता (भले ही पृष्ठभूमि में एक लूप आवश्यक था)। – Jenninha

1

यह एक पुराने पोस्ट है, लेकिन केवल पोस्ट अन्य व्यक्तियों की मदद के लिए)

उदाहरण किसी भी ऑब्जेक्ट प्रकार परिवर्तित करने के लिए:

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

शायद ज़रुरत पड़े बस में मदद करता है किसी को भी, मैंने किया इस तरह - ओपी द्वारा बताए गए अनुसार, एक मूल्य प्रकार से अधिक जटिल वस्तुओं को संभाल लेंगे।

// Assumes: Dictionary<string, MyObject> MyDictionary; 
List<MyObject> list = new List<MyObject>(); 
list.AddRange(MyDictionary.Values.ToArray()); 
संबंधित मुद्दे