使用lambda转换Dictionary的值

时间:2015-11-18 17:32:53

标签: c# linq lambda

我在这里有两个收藏品:

  • 用作缓存的Dictionary<int, Privilege>
  • 一个Dictionary<Workflow, List<enumPrivilege>>,表示给定用户对每个外部工作流程的权限。

这里的事情是缓存具有完整版本的权限(以及id,友好描述,文本说明等等),我需要将Dictionary<Workflow, List<enumPrivilege>>转换为{{ 1}} ...

我可以使用一个lambda吗?

1 个答案:

答案 0 :(得分:2)

取决于您是否具有将单个枚举值转换为相应对象的逻辑,例如一家工厂。

为了转换一个Dictionary<K, List<V>>,您可以使用接受ToDictionary()两次的KeyValuePair方法,这样您就可以第一次使用它来获取密钥,第二次使用它来获取值

假设我们有

 Dictionary<string, List<string>> a = new Dictionary<string, List<string>>();

并希望将其转换为b

的词典string, List<int>
Dictionary<string, List<int>> b 
    = a.ToDictionary(
        kvp => kvp.Key, 
        kvp => kvp.Value.Select(int.Parse).ToList()
    );

通过映射(Select)每个枚举值并在其上执行工厂,您应该能够将枚举转换为对象的方式相同

Dictionary<Workflow, List<Privilege>> b 
    = a.ToDictionary(
        kvp => kvp.Key, 
        kvp => kvp.Value.Select(PrivilegeFactory.Create).ToList()
    );

或者,如果字典的键int是您可以执行的enumPrivile

Dictionary<Workflow, List<Privilege>> b 
    = a.ToDictionary(
        kvp => kvp.Key, 
        kvp => kvp.Value.Select(t => cacheDictionary[(int)t])
    );