在序列中查找缺失和重叠的数字

sve*_*vit 6 c# linq range sequence

假设我们有这样的数据结构:

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)
                };
Run Code Online (Sandbox Code Playgroud)

我想从这个集合中得到两个结果:

  • 所有缺失的数字(在此示例中:105,106,107,108,109)
  • 所有重叠的数字(在这个例子中:8,9,10)

我可以编写一个带有几个循环和辅助集合的算法.这个过程是可行的,但我想知道这是否可以在LINQ和/或其他更简单和更短的算法的帮助下实现?

编辑:我上面例子的数据结构代表5个序列,第一个包含从1到10的数字,第二个包含从8到101的数字等等...因为在生产中序列可以更大(高达数百万),它们不用实际集合表示(例如带有所有数字的列表),而是用元组表示,它代表每个序列的最小和最大数量.

Jen*_*ens 5

您可以通过

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);
Run Code Online (Sandbox Code Playgroud)

  • 并针对每个可能的值或(2 *)N * M对整个元组列表进行两次迭代,其中N是可能值的数量,而M是元组的数量。拥有数百万个可能的值,我会说这是很多迭代! (2认同)