首页 新闻 赞助 找找看

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

0
悬赏园豆:30 [已解决问题] 解决于 2013-08-06 16:10

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);
                }
az235的主页 az235 | 大侠五级 | 园豆:8483
提问于:2013-01-29 14:35
< >
分享
最佳答案
0

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

收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2013-01-29 14:47
 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 | 园豆:8483 (大侠五级) | 2013-01-29 14:59

@az235: 看起来只有用foreach,或者你

_sysMenu.Keys.Skip(10).ForEach(k => _sysMenu.Remove(k));

前提是你定义一个基于IEnumerable<T>的ForEach扩展,这个还是很经常用到的,定义一个不亏。

水牛刀刀 | 园豆:6350 (大侠五级) | 2013-01-29 15:23

@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 | 园豆:265 (菜鸟二级) | 2013-01-29 16:46

@ifecy: 保持前面10个元素的下标不变就可以,再说是用key去删除,下标的变化是无所谓的

ToList方法的装箱拆箱操作耗费资源,比用原生的Foreach方法更加。。。。。

az235 | 园豆:8483 (大侠五级) | 2013-01-30 09:48
其他回答(5)
0

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

收获园豆:5
Rich.T | 园豆:3440 (老鸟四级) | 2013-01-29 14:52

这样的话

 var v = _sysMenu.Keys.Skip(10);
                foreach (var item in v)
                {
                    _sysMenu.Remove(item);
                }

我直接用上面这种方式还好点,上面这种方式不用做类型转换

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2013-01-29 15:00
0

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

收获园豆:5
Qlin | 园豆:2403 (老鸟四级) | 2013-01-29 15:11

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

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2013-01-29 19:46
0

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

收获园豆:5
Louis军 | 园豆:212 (菜鸟二级) | 2013-01-29 23:03

  需要重写ToDictionary方法才可以,因为我是继承的

 public class SerializableDictionary<TKey, TValue>
        : SortedDictionary<TKey, TValue>, IXmlSerializable
    {}
支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2013-01-30 09:44
0

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

收获园豆:5
Eric.luo | 园豆:853 (小虾三级) | 2013-05-16 15:20
0
_sysMenu.Keys.Take(10) ;
收获园豆:5
小银光 | 园豆:25 (初学一级) | 2013-06-07 16:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册