首页 新闻 会员 周边

求一个简单的LINQ语句

0
悬赏园豆:10 [已解决问题] 解决于 2012-05-14 14:54
IDictionary<int, IList<int>> secondlevel = new Dictionary<int, IList<int>>();
IDictionary<int, IList<int>> thirdlevel = new Dictionary<int, IList<int>>();
 secondlevel.Add(1, new List<int>(new int[] { 1, 2 }));
 secondlevel.Add(2, new List<int>(new int[] { 3 }));
 secondlevel.Add(3, new List<int>(new int[] { 4, 5, 6 }));
 thirdlevel.Add(1, new List<int>(new int[] { 5, 6, 7, 8, 20, 13, 24 }));
 thirdlevel.Add(2, new List<int>(new int[] { 23 }));
 thirdlevel.Add(3, new List<int>(new int[] { 22, 25, 26, 27 }));
 thirdlevel.Add(4, new List<int>(new int[] { 19, 28, 29, 30, 31, 38, 33 }));
 thirdlevel.Add(5, new List<int>(new int[] { 32, 35 }));
 thirdlevel.Add(6, new List<int>(new int[] { 34, 36, 37 }));

定义了两个目录,二级目录的值是三级目录的键,现在给定thirdlevel中的一个值,得到它所在分支是第几个,比如5结果是0,6结果是1,23结果7,22结果是0,25的结果是1,19是0,28是1,怎么写啊,谢谢!

happydaily的主页 happydaily | 菜鸟二级 | 园豆:301
提问于:2012-05-12 15:52
< >
分享
最佳答案
1
int GetItemIndex(int index, IDictionary<int, IList<int>> t)
        {
            var result = from x in t where x.Value.Contains(index) select x.Value.IndexOf(index);
            if (result == null || result.Count() < 1) return -1;
            return result.FirstOrDefault();
        }

这个其实真不用那么复杂

收获园豆:10
sinhbv | 老鸟四级 |园豆:2579 | 2012-05-14 10:06

麻烦高手再仔细看下,不是求所在三级的位置,而是根据二级把三级分成三组后,再求位置

happydaily | 园豆:301 (菜鸟二级) | 2012-05-14 10:17
        int GetGroupItemIndex(int item, IDictionary<int, IList<int>> s, IDictionary<int, IList<int>> t)
        {
            int menuKey = t.Where(x => x.Value.Contains(item)).FirstOrDefault().Key;
            menuKey = s.Where(x => x.Value.Contains(menuKey)).FirstOrDefault().Key;
            List<int> menuItem = new List<int>();
            foreach (var l in s[menuKey])
            {
                menuItem.AddRange(t[l]);
            }
            return menuItem.IndexOf(item);
        }

将就用吧

@happydaily: 

sinhbv | 园豆:2579 (老鸟四级) | 2012-05-14 13:24
其他回答(2)
0

没明白你的意思。描述清除点。什么分支什么结果,二级与三级有事什么关系。

无之无 | 园豆:5095 (大侠五级) | 2012-05-12 15:56

二级其实就是对三级进行分类啊,仔细看,二级的值是三级的键

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2012-05-12 15:57

@happydaily: 这个明白了,那你的什么值得到什么分支的第几个是什么意思?没看懂。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-05-12 15:59

@笨笨蜗牛: 分支根据二级目录来的,二级目录共有三个分支,1下面到三级目录的值有5, 6, 7, 8, 20, 13, 24和23;     2下面有22, 25, 26, 27;   3下面有19, 28, 29, 30, 31, 38, 33和 32, 35和 34, 36, 37,

这样分成三组数据,给定一个值,求所在分组的index

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2012-05-12 16:15

@happydaily: 刚写了下,太复杂了。

下面的代码是分条写的:

    int value = 3;
    var k = from c in thirdlevel where c.Value.Contains(value) select new { k = c.Key, index = c.Value.IndexOf(value) };
    var r = k.SingleOrDefault() ?? new { k = 0, index = 0 };
    var m = (from c in secondlevel where c.Value.Contains(r.k) select c.Value).Single();
    var n = m.Where(o => m.IndexOf(o) < m.IndexOf(r.k)).Sum(o => thirdlevel[o].Count);
    var index = n + r.index;

如果要写在一起也不是不可以,但那个编写过程很头痛,而且理解起来也会很难。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-05-12 16:44

@笨笨蜗牛: 这个是另外一个版本的,整合到了一起,不过中间还是有几个地方感觉没简化好,需要再斟酌,可惜没那感觉了。

    var q = from c in thirdlevel
            from d in secondlevel
            where c.Value.Contains(value) && d.Value.Contains(c.Key)
            select c.Value.IndexOf(value)
                        +
                   d.Value
                        .Where(o=>d.Value.IndexOf(o) < d.Value.IndexOf(c.Key))
                        .Sum(o=>thirdlevel[o].Count);
    var index = q.Single();
支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-05-12 17:01
0

    int i=5;
            var second = from m in secondlevel
                         where m.Value.Contains((from n in thirdlevel
                                                 where n.Value.Contains(i)
                                                 select n).FirstOrDefault().Key)
                         select m;

無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-12 16:13

不对吧?这个这选出在二级目录的KEY?

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2012-05-12 16:20

@happydaily: 是哦。我不知道你要什麽哦。不是要2的嗎

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-12 16:30
          int i = 5;
            var second = from m in secondlevel
                         let s=m.Value.IndexOf((from n in thirdlevel
                                                 where n.Value.Contains(i)
                                                 select n).FirstOrDefault().Key)
                         where m.Value.Contains((from n in thirdlevel
                                                 where n.Value.Contains(i)
                                                 select n).FirstOrDefault().Key)
                         select s;

 

@無限遐想: 

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-12 16:47

@無限遐想: 分支根据二级目录来的,二级目录共有三个分支,1下面到三级目录的值有5, 6, 7, 8, 20, 13, 24和23;     2下面有22, 25, 26, 27;   3下面有19, 28, 29, 30, 31, 38, 33和 32, 35和 34, 36, 37,

这样分成三组数据,给定一个值,求所在分组的index

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2012-05-13 20:23

@happydaily: 我上面 的linq就能實現,要不你測試一下哦。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-14 09:17

@無限遐想: 试过了就是不对,

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2012-05-14 10:11

@happydaily: 我根據5.找出是等於1個索引。我都是測試過的。用你的代碼。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-14 12:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册