使用 linq 表达式过滤包含键列表的字典

use*_*476 5 c# linq

我有一本字典,其中包含所有具有相应年龄的用户。

Dictionary<string,int> AllUsers;
Run Code Online (Sandbox Code Playgroud)

我有一个特定用户的列表。

List<String> Users;
Run Code Online (Sandbox Code Playgroud)

我想过滤第一个字典AllUsers,只使用SpecificUsers列表中包含他们名字的用户。

我已经用循环手动做了一些事情,但我想使用 linq 表达式,但我对它们不是很熟悉。

在此先感谢您的帮助

Kam*_*ski 6

它可能工作

var newdict = AllUsers.Where(x => Users.Contains(x.Key))
                                        .ToDictionary(val => val.Key, val => val.Value);
Run Code Online (Sandbox Code Playgroud)

它将使用Users列表中的字典中的所有用户创建新字典(因为 linq 用于查询而不是更新)。您需要使用ToDictionary来实际制作字典。

编辑:正如@Rawling 所说,过滤字典而不是列表会更高效。@Luaan答案中存在的解决方案(我不会像某些人那样复制它)

  • 为什么要遍历`O(1)`-lookup 集合,然后在`O(n)`-lookup 集合上调用`Contains`? (2认同)

Lua*_*aan 6

你可以过滤Users

Users.Where(i => AllUsers.ContainsKey(i)).Select(i => new { User = i, Age = AllUsers[i] });
Run Code Online (Sandbox Code Playgroud)

这样做的主要好处是您使用索引AllUsers进行过滤,因此您的总计算复杂度仅取决于Users(Dictionary.Contains是 O(1)) 中的用户数量- 天真的方法往往是Users * AllUsers

如果你想要一个关于输出的字典,就像将.Select(...)上面的替换为

.ToDictionary(i => i, i => AllUsers[i])
Run Code Online (Sandbox Code Playgroud)