C# 如何消除foreach循环中的虚假/多余空间?

C# 如何消除foreach循环中的虚假/多余空间?,c#,string,foreach,C#,String,Foreach,此代码: 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

此代码:

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“当“element”有前导和尾随空格时(它总是这样做)。我想我可以做到:

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);

…但闻起来不对…

在获取子字符串时,您从
LabelToFind
的第一个实例后的字符开始,但对于长度参数,您只使用
元素的原始长度减去
LabelToFind
的长度。如果在
元素
开头以外的任何位置找到该字符串(您建议总是这样),则该操作将失败,因为您试图获取的字符数多于保留在字符串中的字符数

假设您希望在
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();
                }
            }
        }
    }
}

您可以在切割前同时进行分割和修剪

List<string> logLineElements = line.Split('|').Select(e => e.Trim()).ToList();
List logLineElements=line.Split('|')。选择(e=>e.Trim()).ToList();

我知道;我想知道是否有比我现在做的更好的方法来修剪这个“元素”。它是有效的,但它散发着相当强烈的臭味。很不清楚你到底想达到什么目的。看起来您正在尝试获取元素中LabelToFind之后的所有文本(我已经编辑了我的答案,添加了您可以使用的代码)。不是这样吗?是的。如果行是“goTo被认为是有害的SitOnASpudBucketOtis”,我想要“SitOnASpudBucketOtis”,我已经编辑了我的答案,在返回之前添加了输出的Trim()(这将删除任何尾随空格,以及LabelTofId和字符串其余部分之间的任何空格)。