我有字典索引,并想使用 LINQ 从另一个字典向它添加几个键。
var indices = new Dictionary<string, int>();
var source = new Dictionary<string, int> { { "1", 1 }, { "2", 2 } };
source.Select(name => indices[name.Key] = 0); // doesn't work
var res = indices.Count; // returns 0
然后我用 Min 替换 Select ,一切都按预期工作,LINQ 在我的字典中创建新键。
source.Min(name => indices[name.Key] = 0); // works!!!
var res = indices.Count; // returns 2
题
我想要做的就是在没有 foreach 的情况下初始化字典。为什么执行 LINQ 时字典键会消失?我可以使用什么迭代器或聚合器代替 Min 来为在 LINQ 查询之外声明的字典创建键?
更新 #1
决定使用 System.Interactive 扩展。
更新 #2
我感谢并赞成所有答案,但需要澄清的是,问题的目的不是复制字典,而是在 LINQ 查询中执行一些代码。为了增加它的意义,我实际上有带有字典的类的层次结构,并且在某些时候它们需要同步,所以我想创建扁平的、非层次的字典,用于跟踪,包括所有层次键。
class Account
{
Dictionary<string, User> Users;
}
class User
{
Dictionary<string, Activity> Activities;
}
class Activity
{
string Name;
DateTime Time;
}
现在我想按时间同步所有操作,所以我需要一个跟踪器来帮助我按时间对齐所有操作,而且我不想为帐户、用户和活动创建 3 个循环。因为这将被视为循环的分层地狱,与异步或回调地狱相同。使用 LINQ,我不必在循环内部、内部循环等中创建循环。
Accounts.ForEach(
account => account.Value.Users.ForEach(
user => user.Value.Activities.ForEach(
activity => indices[account.Key + user.Key + activity.Key] = 0));
此外,可以将循环替换为 LINQ 可以被视为代码异味,这不是我的观点,但我完全同意,因为循环太多,您最终可能会出现重复的代码。
https://jasonneylon.wordpress.com/2010/02/23/refactoring-to-linq-part-1-death-to-the-foreach/
您可以说 LINQ 用于查询,而不是用于设置变量,我会说我正在查询......键。
偶然的你
相关分类