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); }
你的_sysMenu类型是Dictionary<K,V>,而它是一个无序的类型(即使目前看起来好像是按照添加的顺序,但是这个是undocumented behavior,不能保证将来不会被修改),因此你需求里的“第11个以后”根本无法确定。首先需要将它的类型改成SortedDictionary<K,V>(你可能需要修改一些代码,比如指定一个合适的comparer),然后_sysMenu.Take(10)取到前10个,接下来根据具体需求选择是ToList还是ToArray还是ToDictionary.
public class SerializableDictionary<TKey, TValue> : SortedDictionary<TKey, TValue>, IXmlSerializable {}
这是Dictionary的自定义原型,你说的这种方式,我当时也想了下,就顺手继承了这个类型
然后我想表达的是有没有办法让linq没有返回值,就是把这一截去掉"Var a ="
var a = from k in _sysMenu.Keys.Skip(10) where _sysMenu.Remove(k) select k;
因为我是要取到第10个以后的数据,然后在集合中删除掉(集合里面只有key可以删除,没有下标删除)
@az235: 看起来只有用foreach,或者你
_sysMenu.Keys.Skip(10).ForEach(k => _sysMenu.Remove(k));
前提是你定义一个基于IEnumerable<T>的ForEach扩展,这个还是很经常用到的,定义一个不亏。
@az235: 需要TOLIST,还有你上面from k in _sysMenu.Keys.Skip(10) where _sysMenu.Remove(k) select k;linq有问题,不能直接该变集合,因为你删除一个数据后,下标都改变了,这个你应该懂
还有你第二个,这里,为什么要加tolist你应该知道吧!不加还是和上面一样报错,这里tolist会自动clone一个副本集合(浅度copy,非深度copy),然后你移掉不会影响到副本集合,但是你改变集合引用属性就会影响副本集合
_sysMenu.Keys.Skip(10).ToList().ForEach(k => _sysMenu.Remove(k));
@ifecy: 保持前面10个元素的下标不变就可以,再说是用key去删除,下标的变化是无所谓的
ToList方法的装箱拆箱操作耗费资源,比用原生的Foreach方法更加。。。。。
你需要移除的是11以后的所有项,也就是其实你定义一个list得到前10项就行了
这样的话
var v = _sysMenu.Keys.Skip(10); foreach (var item in v) { _sysMenu.Remove(item); }
我直接用上面这种方式还好点,上面这种方式不用做类型转换
直接 foreach 好不好。 谁写的 那个linq ,想遭喷啊 。
哥们自己写的,想一行代码整完,整出个四不像来了
_sysMenu = _sysMenu.Take(10).ToDictionary(x => x.Key, x => x.Value);已测试!
需要重写ToDictionary方法才可以,因为我是继承的
public class SerializableDictionary<TKey, TValue> : SortedDictionary<TKey, TValue>, IXmlSerializable {}
_sysMenu.Take(10).ToList().ForEach(item => sysMenu.Remove(item));
_sysMenu.Keys.Take(10) ;