这行Linq代码觉得很变扭,有没有什么办法可改变下

var a = from k in _sysMenu.Keys.Skip(10) where _sysMenu.Remove(k) select k; 不需要返回值的linq修改,大家有什么办法修改下 _sysMenu这是一个全部变量,类型为Dictionary 实现的需要时需要将第11个以后的变量全部修改掉,下面是上面那一行代码的变种 var v = _sysMenu.Keys.Skip(10); foreach (var item in v) { _sysMenu.Remove(item); }
森栏
浏览 476回答 9
9回答

墨色风雨

你的_sysMenu类型是Dictionary,而它是一个无序的类型(即使目前看起来好像是按照添加的顺序,但是这个是undocumented behavior,不能保证将来不会被修改),因此你需求里的“第11个以后”根本无法确定。首先需要将它的类型改成SortedDictionary(你可能需要修改一些代码,比如指定一个合适的comparer),然后_sysMenu.Take(10)取到前10个,接下来根据具体需求选择是ToList还是ToArray还是ToDictionary.

函数式编程

你需要移除的是11以后的所有项,也就是其实你定义一个list得到前10项就行了

慕的地6264312

这样的话 var v = _sysMenu.Keys.Skip(10); foreach (var item in v) { _sysMenu.Remove(item); } 我直接用上面这种方式还好点,上面这种方式不用做类型转换

FFIVE

直接 foreach 好不好。    谁写的 那个linq ,想遭喷啊 。

宝慕林4294392

哥们自己写的,想一行代码整完,整出个四不像来了

梦里花落0921

_sysMenu = _sysMenu.Take(10).ToDictionary(x => x.Key, x => x.Value);已测试!

互换的青春

需要重写ToDictionary方法才可以,因为我是继承的 public class SerializableDictionary : SortedDictionary, IXmlSerializable {}

素胚勾勒不出你

_sysMenu.Take(10).ToList().ForEach(item => sysMenu.Remove(item));

UYOU

_sysMenu.Keys.Take(10) ;
打开App,查看更多内容
随时随地看视频慕课网APP