0

サブストリングが機能しないコードでエラーが見つかりました。「startIndex を文字列の長さより大きくすることはできません」と表示されます。

 static int MyIntegerParse(string possibleInt)
    {
        int i;
        return int.TryParse(possibleInt.Substring(2), out i) ? i : 0;        
    }

ここで手順を使用しました:

var parsed = File.ReadLines(filename)
            .Select(line => line.Split(' ')     
                .Select(MyIntegerParse)
                .ToArray())
            .ToArray();

しかし、以前に部分文字列を使用したことがあり、それが機能しているため、なぜエラーになるのかわかりません。ここで助けを求めることはできますか? thnaks。

サンプル文字列:

10192 20351 30473 40499 50449 60234 
10192 20207 30206 40203 50205 60226 
10192 20252 30312 40376 50334 60252
4

5 に答える 5

1

SubstringpossibleInt2 文字未満の場合は失敗するため、そのテストもコードに追加する必要があります。Split状況によっては、呼び出しで空の文字列が生成されると思われます。この空の文字列は int-parser に渡され、Substring呼び出しに失敗します。したがって、おそらく次の 2 つのことを行う必要があります。

  • 分割で空の文字列を取り除く
  • 解析コードで短い文字列または空の文字列を意図的に処理する

空の文字列を取り除くのはとても簡単です:

var parsed = File.ReadLines(filename)
            .Select(line => line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(MyIntegerParse)
                .ToArray())
            .ToArray();

空の文字列の意図的な処理を追加するには、次のようにします。

static int MyIntegerParse(string possibleInt)
{
    if (string.IsNullOrEmpty(possibleInt) || possibleInt.Length < 2)
    { 
        return 0;
    }

    int i;
    return int.TryParse(possibleInt.Substring(2), out i) ? i : 0;        
}

...または、コンパクトで読みにくい構造が好きな場合:

static int MyIntegerParse(string possibleInt)
{
    int i;
    return (!string.IsNullOrEmpty(possibleInt) 
        && possibleInt.Length >= 2
        && int.TryParse(possibleInt.Substring(2), out i)) ? i : 0;        
}

0いいえ、短すぎる文字列を取得したときに戻ることを選択しました。あなたの場合、他の値を返すか、例外をスローするか、Debug.Assertステートメントを使用する方が理にかなっています。

于 2011-04-19T14:13:33.693 に答える
0

possibleInt文字列は少なくとも2文字の長さである必要があります。そうでない場合は、説明したエラーが表示されます。

于 2011-04-19T14:13:57.173 に答える
0

returnステートメントの前にこれを追加し、それが何が起こっているのかを理解するのに役立つかどうかを確認してください。

Debug.Assert(!string.IsNullOrEmpty(possibleInt) && possibleInt.Length > 2);

デバッグモードで実行している場合、上記の2つのケースが満たされない場合、これは例外をスローします。

次のようなコードコントラクトを使用することもできます。

Contract.Assert(!string.IsNullOrEmpty(possibleInt) && possibleInt.Length > 2);
于 2011-04-19T14:14:23.473 に答える
0

解析しようとしている行はそれほど長くありません。サブストリングのC#仕様から:

The zero-based starting character position of a substring in this instance. 

渡す文字列には、0文字または1文字が含まれています。このような状況を処理するには、コードを変更する必要があります。

編集:さらに、splitのオーバーロードを使用してファイルから空の要素を削除する必要があります:

.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntires)
于 2011-04-19T14:14:28.203 に答える
0

文字列の長さよりも大きいインデックスで始まる文字列の部分文字列を取得しようとしているため、この例外が発生しています。

someString.Substring(x)someStringは、文字列内の位置 x から始まる部分文字列を提供します。これはゼロベースです。この場合、2 は特定の文字列の長さの範囲外であるため、この例外が発生します。

その周りに try catch またはブレークポイントを貼り付けると、この例外の原因となっている文字列の長さが 3 未満であることがわかります。

于 2011-04-19T14:17:18.183 に答える