gpt4 book ai didi

c# + 检查元组列表中的间隙和重叠

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:15 24 4
gpt4 key购买 nike

我有元组列表。每个元组都是一个最小值和最大值。

我想检查提供的列表中是否有任何范围缺失或重叠。

这是定义。

 List<Tuple<int, int>> sequences = new List<Tuple<int, int>>();

例子:

1. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(11, 20));
This is fine

2. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(13, 20));
This there are gaps in the sequence

3. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(10, 20));
This is an overlapping scenario

目前我正在做

  int minrange = 1;
int maxrange = 20;
var gaps = Enumerable.Range(minrange, maxrange).Where(i => sequences.All(t => t.Item1 > i || t.Item2 < i));
var overlapping = Enumerable.Range(minrange, maxrange).Where(i => sequences.Count(t => t.Item1 <= i && t.Item2 >= i) > 1);

当序列的值为:

minrange = 1;
maxrange = 2097152;
sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(11, 20));
sequences.Add(new Tuple<int, int>(21, 2097152));

在这种情况下,我的 var gaps 返回一个它不应该返回的计数,因为它们是一个没有间隙或没有重叠的有效范围

  1. 这是验证它们的正确方法吗?
  2. 我做错了什么?

最佳答案

如果您只需要一个是或否的答案,我相信以下问题的答案:

var overlaps =
(from s1 in sequences from s2 in sequences
where s1.Item2 >= s2.Item1 && s1.Item1 < s2.Item1 select s1).Any();

var gaps =
(from s1 in sequences where s1.Item1 > 1 select s1.Item1).Any(
i => !sequences.Any(
j => j.Item2 >= i-1&&j.Item1 < i));

希望您能够相当轻松地“阅读”第一个查询。第二个让我付出了一些努力,但有效地询问“是否有任何元组(除了从 1 开始的元组)其最低值 1 没有被集合中的另一个元组覆盖?”

但是,如果您的集合很大,我会在 SQL 中而不是在 C# 中执行此操作 - 在这种地方提出此类“基于集合”的问题感觉更自然。

关于c# + 检查元组列表中的间隙和重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8940235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com