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

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)
                };

我想从这个集合中得到两个结果:
  • 所有缺少的数字(在此示例中:105、106、107、108、109)
  • 所有重叠的数字(在此示例中:8、9、10)

  • 我可以编写带有几个循环和辅助集合的算法。当然可以,但是我想知道是否可以借助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/

    10-13 07:48