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

我有字典索引,并想使用 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 用于查询,而不是用于设置变量,我会说我正在查询......键。


婷婷同学_
浏览 117回答 2
2回答

偶然的你

你写了:我想要做的就是在没有 foreach 的情况下初始化字典您想用 中的值替换indices字典中的值source吗?使用Enumerable.ToDictionaryindices = (KeyValuePair<string, int>)source&nbsp; // regard the items in the dictionary as KeyValuePairs&nbsp; &nbsp; .ToDictionary(pair => pair.Key,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // the key is the key from original dictionary&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pair => pair.Value);&nbsp; &nbsp; &nbsp; &nbsp;// the value is the value from the original或者您想将 source 中的值添加到 中已经存在的值中indices?如果你不想在foreach你必须从两个字典,并采取当前值的毗连他们从源的值。然后使用 ToDictionary 创建一个新的 Dictionary。indices = (KeyValuePair<string, int>) indices&nbsp; &nbsp;.Concat(KeyValuePair<string, int>) source)&nbsp; &nbsp;.ToDictionary(... etc)然而,这将浪费处理能力。考虑为 Dictionary 创建扩展函数。请参阅揭开扩展方法的神秘面纱public static Dictionary<TKey, TValue> Copy>Tkey, TValue>(&nbsp; &nbsp; this Dictionary<TKey, TValue> source){&nbsp; &nbsp; &nbsp;return source.ToDictionary(x => x.Key, x => x.Value);}public static void AddRange<TKey, TValue>(&nbsp; &nbsp; this Dictionary<TKey, TValue> destination,&nbsp; &nbsp; Dictionary<TKey, TValue> source){&nbsp; &nbsp; &nbsp;foreach (var keyValuePair in source)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;destination.Add(keyValuePair.Key, keyValuePair.Value);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// TODO: decide what to do if Key already in Destination&nbsp; &nbsp; &nbsp;}}用法:// initialize:var indices = source.Copy();// add values:indices.AddRange(otherDictionary);
打开App,查看更多内容
随时随地看视频慕课网APP