为了账号安全,请及时绑定邮箱和手机立即绑定

在外部创建字典并使用 LINQ 对其进行初始化

在外部创建字典并使用 LINQ 对其进行初始化

C#
婷婷同学_ 2021-10-23 16:50:22
我有字典索引,并想使用 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 workvar 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 用于查询,而不是用于设置变量,我会说我正在查询......键。
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

你写了:


我想要做的就是在没有 foreach 的情况下初始化字典


您想用 中的值替换indices字典中的值source吗?使用Enumerable.ToDictionary


indices = (KeyValuePair<string, int>)source  // regard the items in the dictionary as KeyValuePairs

    .ToDictionary(pair => pair.Key,          // the key is the key from original dictionary

                  pair => pair.Value);       // the value is the value from the original

或者您想将 source 中的值添加到 中已经存在的值中indices?如果你不想在foreach你必须从两个字典,并采取当前值的毗连他们从源的值。然后使用 ToDictionary 创建一个新的 Dictionary。


indices = (KeyValuePair<string, int>) indices

   .Concat(KeyValuePair<string, int>) source)

   .ToDictionary(... etc)

然而,这将浪费处理能力。


考虑为 Dictionary 创建扩展函数。请参阅揭开扩展方法的神秘面纱


public static Dictionary<TKey, TValue> Copy>Tkey, TValue>(

    this Dictionary<TKey, TValue> source)

{

     return source.ToDictionary(x => x.Key, x => x.Value);

}


public static void AddRange<TKey, TValue>(

    this Dictionary<TKey, TValue> destination,

    Dictionary<TKey, TValue> source)

{

     foreach (var keyValuePair in source)

     {

         destination.Add(keyValuePair.Key, keyValuePair.Value);

         // TODO: decide what to do if Key already in Destination

     }

}

用法:


// initialize:

var indices = source.Copy();

// add values:

indices.AddRange(otherDictionary);


查看完整回答
反对 回复 2021-10-23
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信