使用LINQ将此列表列表转换为字典

时间:2014-10-31 11:53:14

标签: c# linq dictionary

我有一个班级:

public class Client
{
    public Client()
    {
        TemplateKeys = new List<int>();
    }

    public List<int> TemplateKeys { get; set; }
}

然后我创建了3个实例:

List<Client> clients = new List<Client>();

Client client = new Client();
client.TemplateKeys.Add(1);
client.TemplateKeys.Add(2);
client.TemplateKeys.Add(3);
clients.Add(client);
//..
Client client1 = new Client();
client1.TemplateKeys.Add(1);
client1.TemplateKeys.Add(3);
clients.Add(client1);
//..
Client client2 = new Client();
client2.TemplateKeys.Add(2);
client2.TemplateKeys.Add(4);
clients.Add(client2);

然后我创建一个词典:

Dictionary<int, string> templatesInUse = new Dictionary<int, string>();

所以,我想要做的是将此TemplateKeys列表中的用户使用的clients带到Distinct()他们和templatesInUse字典的键,其中现在的值为string.Empty。我的想法是,一旦我有了密钥,我就会在数据库中查询与dicitionary中每个密钥相关联的文本。然后我将用数据库中的结果替换string.Empty值,我将能够为每个用户使用模板,而不必多次查询数据库中的相同模板。

所以我所做的是首先尝试提取我设法做的不同值:

List<int> res = clients.SelectMany(cl => cl.TemplateKeys)
                       .Distinct()
                       .ToList();

现在我想让这个LINQ表达式返回所需的Dictionary<int, string>结果。我看到LINQ内置了ToDictionary()扩展方法,但我找不到用ToList()代替ToDictionary()来获取结果的方法:

templatesInUse  = clients.SelectMany(cl => cl.TemplateKeys)
                         .Distinct()
                         .ToDictionary(//tried some things here with no success);

所以我看到几乎所有ToDictionary的例子都使用GroupBy(),即使我不需要分组,我希望看到不使用它的解决方案我重新制作了LINQ像这样:

templatesInUse = clients.SelectMany(cl => cl.TemplateKeys)
                        .Distinct()
                        .GroupBy(t => t)
                        .ToDictionary(g => g.Key, g.ToString());

这适用于某些扩展但是我想要的string.Empty或仅""值我得到一些奇怪的价值,这将在理论上起作用,因为这些值将被替换,但我仍然希望得到一个 clean 我的意思是,在执行LINQ查询后,我希望将TemplateKey作为我的Dictionary键,将空字符串作为我的值。正如我所提到的,我真的很想知道,并希望在使用GroupBy()时不使用ToDictionary()的方式是必须的吗?

1 个答案:

答案 0 :(得分:4)

您不需要分组。只需将密钥指定为数字和值string.Empty.

即可
templatesInUse = clients.SelectMany(cl => cl.TemplateKeys).Distinct()
                 .ToDictionary(x => x, x => string.Empty);