2015-05-02 45 views
0

我想創建一個Lambda表達式,它基於給定的命名輸入從IDictionary創建對象數組。Lambda將IDictionary <字符串,對象>值轉化爲對象[]

這是我到目前爲止有:

var dic = new Dictionary<string, object>() 
     { 
      {"some", "value"}, 
      {"dateTime", DateTime.Now}, 
      {"someNum", 52}, 
      {"other", "values"} 
     }; 

string[] inputArray = { "input", "dateTime", "someNume" }; 

var processedArray = inputArray.Select(i => dic.Where(d => d.Key == i).Select(kvp => kvp.Value)).ToArray(); 

這是不行的,它返回一個IEnumerable<object>但所有的成員都KeyValuePair<string,object>型只是,它的出現,沒有關鍵數據。

我認爲這有一些問題。我不認爲我應該使用dic.Select(),因爲字典中的關鍵條目是唯一的,我顯然引用了錯誤的值或缺少一種方法來投射每個結果。

我不確定如何使用單個Lambda實現此目的。我需要制定出Lambda,因爲我打算將它用作編譯的Lambda。

有人可以告訴我如何做到最好?

回答

3

我認爲這應該可以做到。

var processedArray = 
    (from key in inputArray 
    where dic.ContainsKey(key) 
    select dic[key]).ToArray(); 

或者使用流利/點語法:

var processedArray = inputArray 
    .Where(key => dic.ContainsKey(key)) 
    .Select(key => dic[key]) 
    .ToArray(); 

如果你想還有一個因素在情況下,你processedArray輸出,其中字典錯過了關鍵的(例如,對於「輸入」在你的例子字符串),你可以做這樣的例子(使用null在字典中的欠缺的出入):

var processedArray = inputArray 
    .Select(key => dic.ContainsKey(key) ? dic[key] : null) 
    .ToArray(); 
+0

@chomba,對不起,我似乎已經超越了你的建議編輯時,我仍然試圖改善它自己,沒有注意到你的建議。我注意到後將其合併。隨意提出其他改進建議。 – Alex

+0

感謝您對我正在嘗試執行的操作非常有用的編輯:) – Guerrilla

2

您應該能夠僅僅通過選擇這些使用字典索引:

inputArray.Select(k => dic[k]); 
+0

這會爲OPs示例輸入引發'KeyNotFoundException'。 – Alex

+0

@Alex確實如此。我認爲你的答案行爲可能更接近OP的期望。 –

相關問題