C# 拆分数组的元素

C# 拆分数组的元素,c#,split,C#,Split,在我的C#程序中(我是C#新手,所以我希望我做的事情是正确的),我尝试读取文本文件中的所有行,这些行看起来与此类似,但有更多的条目(这些是虚构的人,所以不必担心隐私): 我将这些行读入一个数组,concentrationArray,并希望找到包含单词“Current”的行,在“Program(s):”中的“(s):”处拆分它们,然后打印后面的单词。我在我的程序前面已经做过这样的操作,但是在ID处进行拆分,如下所示: nameLine = nameIDLine.Split(new string[]

在我的C#程序中(我是C#新手,所以我希望我做的事情是正确的),我尝试读取文本文件中的所有行,这些行看起来与此类似,但有更多的条目(这些是虚构的人,所以不必担心隐私):

我将这些行读入一个数组,
concentrationArray
,并希望找到包含单词“Current”的行,在“Program(s):”中的“(s):”处拆分它们,然后打印后面的单词。我在我的程序前面已经做过这样的操作,但是在ID处进行拆分,如下所示:

nameLine = nameIDLine.Split(new string[] { "ID" }, StringSplitOptions.None)[1];
concentrationArray[i].Replace("Current Program(s): ", "")
但是,每当我尝试这样做时,我都会得到一个错误,即我的索引超出了分割数组的界限(不是我的
concentrationArray
)。以下是我目前拥有的:

for (int i = 0; i < concentrationArray.Length; i++)
{
    if (concentrationArray[i].Contains("Current"))
    {
            lstTest.Items.Add(concentrationArray[i].Split(new string[] { "(s): " }, StringSplitOptions.None)[1]);
    }
}
for(int i=0;i
我感到困惑的是,如果我将索引改为0而不是1,它将完美地打印出所有内容,但它将打印出前半部分,而不是我想要的后半部分。我做错了什么?任何反馈都非常感谢,因为我是C#的新手,很想了解我所能了解的。谢谢


编辑-我唯一能想到的是,有时我用来分隔每个元素的字符串后面可能没有任何内容,但当我检查文本文件时,我发现情况并非如此,在用于分隔的字符串后面总是有一些内容。

在尝试读取索引1之前,您应该检查拆分的结果。
如果您的行不包含“(s):”,则代码将崩溃,并出现给定的异常

for (int i = 0; i < concentrationArray.Length; i++)
{
    if (concentrationArray[i].Contains("Current"))
    {
         string[] result = concentrationArray[i].Split(new string[] { "(s): " }, StringSplitOptions.None);
         if(result.Length > 1)
             lstTest.Items.Add(result[1]);
         else
             Console.WriteLine($"Line {i} has no (s): followeed by a space");
    }
}
for(int i=0;i1)
lstest.Items.Add(结果[1]);
其他的
WriteLine($“行{i}没有(s):后跟空格”);
}
}

要完成回答,如果始终使用索引0,则不会出现错误,因为当输入字符串中不存在分隔符时,如果该行始终以

Current Program(s):
那么为什么不用空字符串替换它,如下所示:

nameLine = nameIDLine.Split(new string[] { "ID" }, StringSplitOptions.None)[1];
concentrationArray[i].Replace("Current Program(s): ", "")

这里有一点不同的方法

            List<string> test = new List<string>();
            string pattern = "Current Program(s):";
            string[] allLines = File.ReadAllLines(@"C:\Users\xyz\Source\demo.txt");
            foreach (var line in allLines)
            {
                if (line.Contains(pattern))
                {
                    test.Add(line.Substring(line.IndexOf(pattern) + pattern.Length));
                }
            }

如果将关注点分开,可能会更容易理解和重用。它也将更容易测试。一个例子可能是

var allLines = File.ReadLines(@"C:\your\file\path\data.txt");
var currentPrograms = ExtractCurrentPrograms(allLines);

if (currentPrograms.Any())
{
    lstTest.Items.AddRange(currentPrograms);
}

私有静态IEnumerable ExtractCurrentPrograms(IEnumerable行)
{
const string targetPhrase=“当前程序:”;
foreach(行中的var行,其中(l=>!string.IsNullOrWhiteSpace(l)))
{
var指数=line.IndexOf(目标短语);
如果(索引>=0)
{
var programIndex=索引+目标短语.Length;
var text=line.Substring(programIndex.Trim();
如果(!string.IsNullOrWhiteSpace(text))
{
产生返回文本;
}
}
}
}

在尝试读取索引1之前,应检查拆分结果。如果您的代码行不包含“(s):”,则代码将因异常而崩溃given@Steve但是,如果我使用0而不是1作为索引,为什么会起作用呢?因为如果没有分隔符,那么输出是一个包含整个未分隔元素的数组string@Steve哦,好的,每当我阅读split方法注释时,我都没有看到这一点。谢谢您还可以打印整行以查看其外观。这可能非常有用。或者至少是行号,如果你可以在迭代时跟踪这些,那就行了,谢谢!我不想检查所有包含Current的行是否也包含拆分字符串,因为它们应该包含拆分字符串,我只是遗漏了一个。如果文件很大,使用
File.ReadAllLines
可能会带来麻烦。最好使用
File.ReadLines
并枚举它们。
private static IEnumerable<string> ExtractCurrentPrograms(IEnumerable<string> lines)
{
    const string targetPhrase = "Current Program(s):";

    foreach (var line in lines.Where(l => !string.IsNullOrWhiteSpace(l)))
    {
        var index = line.IndexOf(targetPhrase);

        if (index >= 0)
        {
            var programIndex = index + targetPhrase.Length;
            var text = line.Substring(programIndex).Trim();

            if (!string.IsNullOrWhiteSpace(text))
            {
                yield return text;
            }
        }
    }
}