2

このコード:

const string LabelToFind = "goTo considered Harmful";
using (var file = new StreamReader(DownloadedFile))
{
    string line;
    while ((line = file.ReadLine()) != null) {
        if ((line.Contains(keyVal)) && (line.Contains(LabelToFind))) {
            string[] logLineElements = line.Split('|'); 
            foreach (string element in logLineElements) {
                if (element.Contains(LabelToFind)) {
                    return element.Substring(element.IndexOf(LabelToFind, StringComparison.Ordinal) + LabelToFind.Length, element.Length - LabelToFind.Length);
                }
            }
        }
    }
}

...「引数が範囲外の例外: インデックスと長さは、文字列内の場所を参照する必要があります。パラメーター名: 長さ」で失敗します (「要素」の先頭と末尾にスペースがある場合 (常にそうです)。私はこれを行うことができると思います:

foreach (string element in logLineElements) {
    if (element.Contains(LabelToFind)) {
        String s = element.Trim();
        return s.Substring(s.IndexOf(LabelToFind, StringComparison.Ordinal) + LabelToFind.Length, s.Length - LabelToFind.Length);

…が、匂いがしない…

4

2 に答える 2

1

部分文字列を取得する際、 の最初のインスタンスの後の文字から開始しますLabelToFindが、長さパラメーターについては、 の元の長さelementから の長さを引いたものを使用していますLabelToFind。文字列が先頭以外の場所にelementある場合 (これは常にそうであると示唆しています)、文字列に残るよりも多くの文字を取得しようとしているため、これは失敗します。

の後に文字列を返したいと仮定するとLabelToFind、これはコードが実行しようとしているように見えます。

const string LabelToFind = "goTo considered Harmful";
using (var file = new StreamReader(DownloadedFile))
{
    string line;
    while ((line = file.ReadLine()) != null)
    {
        if (line.Contains(keyVal) && line.Contains(LabelToFind))
        {
            foreach (var element in line.Split('|'))
            {
                var index = element.IndexOf(LabelToFind, StringComparison.Ordinal);
                if (index != -1)
                {
                    return element.Substring(index + LabelToFind.Length, element.Length - LabelToFind.Length - index).Trim();
                }
            }
        }
    }
}
于 2012-06-19T00:10:40.380 に答える
1

foreach の前に同時に分割とトリムを行うことができます。

List<string> logLineElements = line.Split('|').Select(e => e.Trim()).ToList();
于 2012-06-19T00:22:31.330 に答える