C#Linq或Lambda获取Dictionary <string,list <string =“”>&gt;来自一个类</string,>

时间:2013-09-05 15:17:50

标签: c# linq dictionary lambda

我似乎找不到我要找的答案。希望有人可以提供帮助。

我有一个包含某些进程的设置信息的类。每个类都有一个processId,taskId和我当前逻辑不需要的各种其他信息。

public class ProcessSetting
{
    public int ProcessId { get; set; }
    public int TaskId { get; set; }

    // Other properties not needed
}

可以存在多个ProcessSettings。我将数据拉入List。可以将processId与多个TaskId相关联。例如:

ProcessId: 1, TaskId: 1
ProcessId: 1, TaskId: 1
ProcessId: 1, TaskId: 2
ProcessId: 1, TaskId: 3
ProcessId: 2, TaskId: 3
ProcessId: 2, TaskId: 4
ProcessId: 3, TaskId: 1

我最初使用linq只是从现有的枚举中收集我需要的值:(最后使用distinct来避免拉入ProcessId 1和TaskId 1的多个记录集)

var baseSettings = (from setting in processSettings
                    select new
                              {
                                  ProcessStr = ((ProcessEnum)setting.ProcessId).ToString(),
                                  TaskStr = ((TaskEnum)setting.TaskId).ToString()
                              }).Distinct();

这现在给我一个只包含processId和taskId的列表。我发现这里的一些逻辑引导我朝着正确的方向前进,但这并不是我所需要的。这就是:

Dictionary<string, List<string> = baseSettings.GroupBy(x => x.ProcessStr).ToDictionary(x => x.Key, x => x.ToList());

然而,这是不正确的。我收到一个错误:

  

“无法转换来源类型   System.Collections.Generic.Dictionary<string,System.Generic.List{ProcessStr:string, TaskStr:string}>>目标类型   System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<string>>

我不想要一个值为{ProcessStr,TaskStr}的Key。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:9)

而不是x.ToList,您必须首先选择匿名类型的字符串属性:

Dictionary<string, List<string>> procTasks = baseSettings
    .GroupBy(x => x.ProcessStr)
    .ToDictionary(g => g.Key, g => g.Select(x => x.TaskStr).ToList());