C#应用程序中的System.ArgumentOutOfRangeException

C#应用程序中的System.ArgumentOutOfRangeException,c#,indexing,C#,Indexing,我已经实施了Cuong在此提出的解决方案: 我还让它通过一个文件夹,并将其应用于该文件夹中的所有.txt文件 所有这些都可以正常工作,但对于一些.txt文件,它在var csvline上失败,并出现以下错误: {"Index and length must refer to a location within the string.\r\nParameter name: length"} A first chance exception of type 'System.ArgumentOut

我已经实施了Cuong在此提出的解决方案:

我还让它通过一个文件夹,并将其应用于该文件夹中的所有.txt文件

所有这些都可以正常工作,但对于一些.txt文件,它在var csvline上失败,并出现以下错误:

{"Index and length must refer to a location within the string.\r\nParameter name: length"}

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
   at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
   at System.String.Substring(Int32 startIndex, Int32 length)
   at FixedWidthFiles.Main.<>c__DisplayClass11.<>c__DisplayClass13.<buttonProcessAllFiles_Click>b__d(KeyValuePair`2 pair) in \\GBMACCMPFS11\Shhk$\Visual Studio 2010\Projects\FixedWidthFiles\FixedWidthFiles\Main.cs:line 138
   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
   at System.String.Join(String separator, IEnumerable`1 values)
   at FixedWidthFiles.Main.<>c__DisplayClass11.<buttonProcessAllFiles_Click>b__c(String line) in \\GBMACCMPFS11\Shhk$\Visual Studio 2010\Projects\FixedWidthFiles\FixedWidthFiles\Main.cs:line 137
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.IO.File.InternalWriteAllLines(TextWriter writer, IEnumerable`1 contents)
   at System.IO.File.WriteAllLines(String path, IEnumerable`1 contents)
   at FixedWidthFiles.Main.buttonProcessAllFiles_Click(Object sender, EventArgs e) in \\GBMACCMPFS11\Shhk$\Visual Studio 2010\Projects\FixedWidthFiles\FixedWidthFiles\Main.cs:line 140

通读堆栈跟踪。第一个有趣的地点是:

Visual Studio 2010\Projects\FixedWidthFiles\FixedWidthFiles\Main.cs:line 138
这是你的文件,还有你的代码。例外情况是,您正在从大于字符串大小的索引中读取字符串。这一切都表明代码中存在错误。转到该文件并分析该行。一旦你想了想,不知道为什么索引会在那个地方超出范围,复制代码和一些代码,然后发布在这里。仅仅凭那条线索很难说出更多的东西

编辑:你已经添加了代码,酷

由于它在子字符串中肯定失败,请查看子字符串作为索引的内容:它是来自pair的值。该值来自列宽的增量求和,因此很可能您的一个输入文件中有一行。。。太短了。检查文件的开头或结尾是否有虚假的空行

您必须去除这些行的文件,或者针对这些行修复代码:与其盲目调用子字符串,不如使用if或Math.min来保护它:

str.Substring(
    Math.Min(str.Length, pair.Key), // here it MAY be needed a str.Length-1 instead!
    Math.Min(Math.Max(0,str.Length-pair.Key), pair.Value)
)
这样,对于所有太短的管柱,现场切割机将返回空管柱。请注意,保护这两个参数是很好的,还值得检查长度StartIndex是否为负数,因为它们可能大于空行的长度:)


顺便说一句,我所说的StartIndex当然是指pair.Key..

读取堆栈跟踪。第一个有趣的地点是:

Visual Studio 2010\Projects\FixedWidthFiles\FixedWidthFiles\Main.cs:line 138
这是你的文件,还有你的代码。例外情况是,您正在从大于字符串大小的索引中读取字符串。这一切都表明代码中存在错误。转到该文件并分析该行。一旦你想了想,不知道为什么索引会在那个地方超出范围,复制代码和一些代码,然后发布在这里。仅仅凭那条线索很难说出更多的东西

编辑:你已经添加了代码,酷

由于它在子字符串中肯定失败,请查看子字符串作为索引的内容:它是来自pair的值。该值来自列宽的增量求和,因此很可能您的一个输入文件中有一行。。。太短了。检查文件的开头或结尾是否有虚假的空行

您必须去除这些行的文件,或者针对这些行修复代码:与其盲目调用子字符串,不如使用if或Math.min来保护它:

str.Substring(
    Math.Min(str.Length, pair.Key), // here it MAY be needed a str.Length-1 instead!
    Math.Min(Math.Max(0,str.Length-pair.Key), pair.Value)
)
这样,对于所有太短的管柱,现场切割机将返回空管柱。请注意,保护这两个参数是很好的,还值得检查长度StartIndex是否为负数,因为它们可能大于空行的长度:)


顺便说一句,我所说的StartIndex当然是指pair.Key.

我认为它在Substring方法上失败了。你能添加一个检查行.Length>(pair.Key+pair.Value)吗?

我认为它在Substring方法上失败了。你能添加一个检查行.Length>(pair.Key+pair.Value)吗?

如果你想要一个准确的答案,你需要发布你的准确代码。但它确实给了你格扎尔卡特指出的行号out@Benjamin-我现在已经在原始问题中添加了代码:)你需要检查哪一行是正确的抛出例外如果你想要准确的答案,你需要发布准确的代码。但它确实给了你格扎尔卡特指出的行号out@Benjamin-我现在已经在原始问题中添加了代码:)您需要检查哪一行抛出,除非有机会您可以告诉我如何执行此操作?我对此有点不知所措:(可能是:var csvLines=lines.Select(line=>string.Join(“,”,list.Where(pair=>line.Length>(pair.Key+pair.Value))。Select(pair=>line.Substring(pair.Key,pair.Value));你能告诉我怎么做吗?我对此有点不知所措:(可能是:var csvLines=lines.Select(line=>string.Join(“,”,list.Where(pair=>line.Length>(pair.Key+pair.Value)).Select(pair=>line.Substring(pair.Key,pair.Value));您所说的大部分对我来说毫无意义,但我会尝试实现您早上提出的建议:)我将解释一下代码。他所做的是剪切值,这样就不可能生成此类错误。大多数人只是使用if语句跳过子字符串,但他正在处理它,这样代码就会正常执行。子字符串的参数表示“从value开始,除非它比字符串长,然后使用字符串长度”第二个参数说“要么抓取值中存储的字符数,要么如果字符串不够长,就抓取所有字符“如果你在纸上试一下,你可以自己看到这一点。你所说的大部分对我来说毫无意义,但我会尝试在早上落实你的建议:)我将解释一下代码。他所做的是剪切值,这样就不可能生成此类错误。大多数人只是使用if语句跳过子字符串,但他正在处理它,这样代码就会正常执行。子字符串的参数表示“从value开始,除非它比字符串长,然后使用字符串长度”第二个参数说“要么抓取值中存储的字符数,要么如果字符串不够长,就抓取所有字符”。如果您在纸上尝试,您可以亲自看到这一点。