Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保数组在C中是顺序的#_C#_Arrays_Algorithm_Data Structures_Sequences - Fatal编程技术网

C# 确保数组在C中是顺序的#

C# 确保数组在C中是顺序的#,c#,arrays,algorithm,data-structures,sequences,C#,Arrays,Algorithm,Data Structures,Sequences,我从第三方提供商那里得到了一个整数数组。这意味着它们是连续的,但出于某种原因,它们缺少一个数字(某个东西抛出一个异常,它被吃掉,循环继续缺少该索引)。这会给我们的系统带来一些麻烦,我正在努力确保我们得到的数组确实是连续的 数字从不同的偏移量开始(有时是1000,有时是5820,其他是0),但不管从什么开始,它意味着从那里开始 验证阵列是否连续的最快方法是什么?即使这是一个必要的步骤,现在看来,我还必须确保它不会花太长时间来验证。我现在从第一个索引开始,提取数字并添加一个,确保下一个索引包含该数字

我从第三方提供商那里得到了一个整数数组。这意味着它们是连续的,但出于某种原因,它们缺少一个数字(某个东西抛出一个异常,它被吃掉,循环继续缺少该索引)。这会给我们的系统带来一些麻烦,我正在努力确保我们得到的数组确实是连续的

数字从不同的偏移量开始(有时是1000,有时是5820,其他是0),但不管从什么开始,它意味着从那里开始

验证阵列是否连续的最快方法是什么?即使这是一个必要的步骤,现在看来,我还必须确保它不会花太长时间来验证。我现在从第一个索引开始,提取数字并添加一个,确保下一个索引包含该数字,等等

编辑:
该系统失败的原因是因为人们使用该系统的方式,它可能并不总是按照最初选择的方式返回代币——说来话长。不幸的是,在数据到达我们的图层之前无法更正数据。

如果您确定数组已排序且没有重复项,您可以检查:

array[array.Length - 1] == array[0] + array.Length - 1

如果确定数组已排序且没有重复项,则只需检查:

array[array.Length - 1] == array[0] + array.Length - 1
for(inti=a.Length-2;0=a[i+1])返回false;//不按顺序
}
返回true;//依次
for(int i=a.Length-2;0=a[i+1])返回false;//不按顺序
}
返回true;//依次

如果对数组进行排序,Gabe的方法肯定是最快的。如果数组没有排序,那么最好对数组进行排序(使用merge/shell排序(或类似的速度),然后使用Gabe的方法。

如果数组排序,Gabe的方法肯定是最快的。如果数组没有排序,那么最好对数组进行排序(使用merge/shell排序(或类似的速度),然后使用Gabe的方法。

我认为这里值得解决一个更大的问题:如果数据不符合您的要求(顺序,没有间隙),您将怎么做

如果您仍要处理数据,那么您可能应该投入时间使您的系统更能适应数据中的缺口或缺失条目

**如果您需要处理数据,并且数据必须干净,您应该与供应商合作,确保他们向您发送格式正确的数据

如果要跳过处理并报告错误,那么断言无间隙的前提条件可能是一种方法。在C#中,你可以做很多不同的事情:

  • 如果数据已排序且没有DUP,只需检查
    LastValue==FirstValue+ArraySize-1
  • 如果数据没有排序,但没有dup,只需对其排序并执行上述操作即可
  • 如果数据没有排序,有DUP,并且您实际上想要检测间隙,我将使用LINQ
  • List gaps=Enumerable.Range(array.Min(),array.Length)。除了(array.ToList()

    或者更好(因为高端值可能超出范围):

    int minVal=array.Min();
    int maxVal=array.Max();
    List gaps=Enumerable.Range(minVal,maxVal-minVal+1)。除了(array.ToList();
    

    顺便说一句,对于双方之间的接口来说,传递一个密集的、无间隙的整数数组的整个概念有点奇怪,除非有一些额外的数据与之相关。如果没有其他数据,为什么不发送一个范围{min,max}来代替呢?

    我认为值得在这里解决一个更大的问题:如果数据不满足您的要求(顺序,没有间隙),您将怎么办

    如果您仍要处理数据,那么您可能应该投入时间使您的系统更能适应数据中的缺口或缺失条目

    **如果您需要处理数据,并且数据必须干净,您应该与供应商合作,确保他们向您发送格式正确的数据

    如果要跳过处理并报告错误,那么断言无间隙的前提条件可能是一种方法。在C#中,你可以做很多不同的事情:

  • 如果数据已排序且没有DUP,只需检查
    LastValue==FirstValue+ArraySize-1
  • 如果数据没有排序,但没有dup,只需对其排序并执行上述操作即可
  • 如果数据没有排序,有DUP,并且您实际上想要检测间隙,我将使用LINQ
  • List gaps=Enumerable.Range(array.Min(),array.Length)。除了(array.ToList()

    或者更好(因为高端值可能超出范围):

    int minVal=array.Min();
    int maxVal=array.Max();
    List gaps=Enumerable.Range(minVal,maxVal-minVal+1)。除了(array.ToList();
    

    顺便说一句,对于双方之间的接口来说,传递一个密集的、无间隙的整数数组的整个概念有点奇怪,除非有一些额外的数据与之相关。如果没有其他数据,为什么不发送一个范围{min,max}来代替呢?

    如果你总是得到一个顺序数组,为什么他们不传递一个数字给你来生成你这边的数组呢?你需要它是顺序的还是连续的?是否可以只获得起始值和结束值(或元素数)然后自己创建阵列
    Enumerable.Range(start,count)
    <代码>可枚举。范围(开始,计数)
    +1这很聪明。只需检查最后一个数字是否等于起始数字加上数组长度。不需要任何循环及其O(1)复杂性。@JK:但它强烈依赖于生成端的错误类型。如果有什么东西坏了怎么办
    int minVal = array.Min();
    int maxVal = array.Max();
    List<int> gaps = Enumerable.Range(minVal, maxVal-minVal+1).Except(array).ToList();