【发布时间】:2014-08-15 22:24:53
【问题描述】:
以下代码:
Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();
dic.Add(1, new List<int>());
dic[1].Add(10);
dic[1].Add(6);
dic.Add(2, new List<int>());
dic[2].Add(9);
dic[2].Add(7);
dic[2].Add(7);
dic.Add(3, new List<int>());
dic[3].Add(9);
dic[3].Add(10);
dic[3].Add(9);
dic.Add(4, new List<int>());
dic[4].Add(6);
// Will give KVPs of Key 1 and 4
var under7 = dic.Where(T => T.Value.Any(Y => Y < 7));
所以我很容易发现哪些 KVP 的值小于 7。
我的问题是如何遍历字典以找出具有重复值的 KVP,其中一个键跟随另一个键(已经按顺序排列)。
因为在这个应该被拿起:
dic.Add(2, new List<int>());
dic[2].Add(9);
dic[2].Add(7); // MATCH
dic[2].Add(7); // MATCH
但不是这个:
dic.Add(3, new List<int>());
dic[3].Add(9); // NOT MATCH
dic[3].Add(10);
dic[3].Add(9); // NOT MATCH
有没有办法使用 LINQ 来做到这一点?
尝试尝试一下,使用类似下面的方法,但显然它不起作用。
// Should give KVP of Key 2 but not 3
var dupVals = dic.Where(T => T.Value.Aggregate( (i1, i2) => i1 == i2));
var dupVals = dic.Where(T => T.Value.Any( (i1,i2) => i1 == i2 ));
编辑: 所以谢尔盖有了答案:
var result = dic.Where(kvp =>
kvp.Value.Skip(1).Zip(kvp.Value, (x, y) => x == y).Any(b => b));
但这究竟是如何工作的呢?
【问题讨论】:
-
嗯...当您运行它时,它不会在第三行(
dic[1].Add(10);)抛出越界异常吗? -
我将从简单的任务开始 - 检查列表是否有两个连续的重复值。不要用字典使问题复杂化
-
我觉得使用简单的
for或foreach循环会更容易。 -
旁注:
Dictionary正式来说没有“跟随”的概念,因为它是无序结构。