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,怎么写啊,谢谢!
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(); }
这个其实真不用那么复杂
麻烦高手再仔细看下,不是求所在三级的位置,而是根据二级把三级分成三组后,再求位置
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:
没明白你的意思。描述清除点。什么分支什么结果,二级与三级有事什么关系。
二级其实就是对三级进行分类啊,仔细看,二级的值是三级的键
@happydaily: 这个明白了,那你的什么值得到什么分支的第几个是什么意思?没看懂。
@笨笨蜗牛: 分支根据二级目录来的,二级目录共有三个分支,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
@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;
如果要写在一起也不是不可以,但那个编写过程很头痛,而且理解起来也会很难。
@笨笨蜗牛: 这个是另外一个版本的,整合到了一起,不过中间还是有几个地方感觉没简化好,需要再斟酌,可惜没那感觉了。
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();
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;
不对吧?这个这选出在二级目录的KEY?
@happydaily: 是哦。我不知道你要什麽哦。不是要2的嗎
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;
@無限遐想:
@無限遐想: 分支根据二级目录来的,二级目录共有三个分支,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
@happydaily: 我上面 的linq就能實現,要不你測試一下哦。
@無限遐想: 试过了就是不对,
@happydaily: 我根據5.找出是等於1個索引。我都是測試過的。用你的代碼。