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 回答