假设我们有一个像这样的数据结构:
var sequences = new List<Tuple<int, int>>
{
new Tuple<int, int>(1, 10),
new Tuple<int, int>(8, 101),
new Tuple<int, int>(102, 103),
new Tuple<int, int>(104, 104),
new Tuple<int, int>(110, 200)
};
我想从这个集合中得到两个结果:
我可以编写带有几个循环和辅助集合的算法。当然可以,但是我想知道是否可以借助LINQ和/或其他更简单,更短的算法来实现?
编辑:
上例中的数据结构代表5个序列,第一个序列包含从1到10的数字,第二个序列包含从8到101的数字,依此类推...因为在生产中,序列可以更大(最多到数百万),它们不是用实际的集合表示(例如,用所有数字的列表表示),而是用元组表示,它表示每个序列的最小和最大数量。
最佳答案
您可以通过
var missing =
Enumerable.Range(1, 200)
.Where(i => sequences.All(t => t.Item1 > i || t.Item2 < i));
var overlapping =
Enumerable.Range(1, 200)
.Where(i => sequences.Count(t => t.Item1 <= i && t.Item2 >= i) > 1);
关于c# - 查找序列中缺失和重叠的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7024051/