Lambda将IDictionary <string,object>值转换为object []

时间:2015-05-02 23:16:19

标签: c# linq lambda

我正在尝试创建一个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。

有人可以告诉我最好的方法吗?

2 个答案:

答案 0 :(得分: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(); 

答案 1 :(得分:2)

您应该只需访问字典索引就可以选择这些:

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