此代码:
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);
}
}
}
}
}
...失败并且“参数超出范围异常:索引和长度必须引用字符串中的位置。 参数名称:length“when”元素“有一个前导和尾随空格(它总是这样)。我想我可以这样做:
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);
......但闻起来不对......
答案 0 :(得分: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();
}
}
}
}
}
答案 1 :(得分:1)
您可以在foreach之前分割和修剪相同的时间。
List<string> logLineElements = line.Split('|').Select(e => e.Trim()).ToList();