我有一个班级:
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()
的方式是必须的吗?
答案 0 :(得分:4)
您不需要分组。只需将密钥指定为数字和值string.Empty.
templatesInUse = clients.SelectMany(cl => cl.TemplateKeys).Distinct()
.ToDictionary(x => x, x => string.Empty);