2016-09-08 15 views
7

साथ शब्दकोश में सूची का चयन मैं एक सूची सूचकांक

List<string> sList = new List<string>() { "a","b","c"}; 

हैं और वर्तमान में मैं निम्नलिखित संरचना एक शब्दकोश में इस का चयन कर रहा हूँ:

//(1,a)(2,b)(3,c) 
Dictionary<int, string> dResult = new Dictionary<int, string>(); 
for(int i=0;i< sList.Count;i++) 
{ 
    dResult.Add(i, sList[i]); 
} 

लेकिन Linq के साथ मैं कुछ स्लिमर देखा है ToDictionary((x,index) =>

सही सिंटैक्स कैसा है या यह एक पंक्ति के भीतर कैसे हल किया जा सकता है?

+1

आप * जानते हैं कि मूल सूची शब्दकोश से अधिक प्रदर्शनकारी होगी? अर्थात। एक शब्दकोश आमतौर पर तब प्रयोग किया जाता है जब आपके पास स्पैस या गैर-संख्यात्मक कुंजी होती है। – Groo

उत्तर

12

आप Select का अधिभार कि सूचकांक परियोजनाओं का उपयोग एक गुमनाम प्रकार भरने के लिए कर सकते हैं:

Dictionary<int, string> dResult = sList 
    .Select((s, index) => new { s, index }) 
    .ToDictionary(x => x.index, x => x.s); 

क्या अपने कोड करता है के रूप में ही है। यदि आप इसके बजाय परिणाम चाहते हैं तो आपने टिप्पणी की है: (1,a)(2,b)(3,c)) आपको +1 को ToDictionary(x => x.index+1, x => x.s) जोड़ना होगा।

var tmp = sList.Select((x, i) => new { Key = i, Value = x }); 

अब शब्दकोश बनाने के लिए::

var result = tmp.ToDictionary(x => x.Key, x => x.Value); 

या एक एक के रूप में

3

सबसे पहले आप select-overload वह भी वर्तमान में प्रयोग तत्व के सूचकांक Provices का उपयोग कर कुंजी और मान प्राप्त करने के लिए -लाइनर:

var result = sList.Select((x, i) => new { Key = i, Value = x }).ToDictionary(x => x.Key, x => x.Value); 

संपादित करें: आप अपना स्वयं का एक्सटेंशन-विधि भी बना सकते हैं भी वाक्य रचना आपके द्वारा दी गई उपयोग करने के लिए:

public static Dictionary<TResultKey, TResultValue> ToDictionary<TSource, TResultKey, TResultValue>(this IEnumerable<TSource> src, Func<TSource, int, TResultKey> KeySelector, Func<TSource, int, TResultValue> ValueSelector) 
{ 
    var result = new Dictionary<TResultKey, TResultValue>(); 
    int i = 0; 
    foreach (var element in src) 
    { 
     result[KeySelector(element, i)] = ValueSelector(element, i); 
     i++; 
    } 
    return result; 
} 

अब आप इस तरह यह कॉल कर सकते हैं:

List<string> sList = new List<string>() { "a","b","c"}; 
var result = sList.ToDictionary((x, i) => i + 1, (x, i) => x); 
7

, कोई ToDictionary विधि है कि एक कॉल में इस देता है के रूप में वहाँ कोई भार के कि प्रदान कर रहे हैं ,

var dictionary = list.Select((value, index) => new { value, index }) 
        .ToDictionary(pair => pair.index, pair => pair.value); 

या में सी # 7 ढेर-आवंटित ओर्ब का एक समूह बनाने से परहेज: सूचकांक, लेकिन आप Select अधिभार जो एक Func<T, int, TResult> स्वीकार करता है का उपयोग कर सकते ts ValueTuple का उपयोग कर:

var dictionary = list.Select((v, i) => (value: v, index: i)) 
        .ToDictionary(pair => pair.index, pair => pair.value); 

सी # 7.1 बिंदु रिलीज के रूप में, आप अनुमानित ValueTuple शाब्दिक अभिव्यक्ति का उपयोग कर सकते हैं:

var dictionary = list.Select((value, index) => (value, index)) 
        .ToDictionary(pair => pair.index, pair => pair.value); 

(टिम द्वारा बताया गया है, आप 1 से सूचकांक को समायोजित करना होगा मूल का अनुरोध उत्पादन प्राप्त करने के लिए)

2

तुम भी एक गुमनाम प्रकार के बिना इस दृष्टिकोण का उपयोग कर सकते हैं:।

Dictionary<int, string> dResult = Enumerable 
    .Range(0, sList.Count()) 
    .ToDictionary(i => i + 1, i => sList[i]);