在某一行</string>之后拆分List <string>

时间:2014-12-02 20:56:15

标签: c# .net visual-studio-2010

我使用StreamReader每行读取一个文件,并将每一行作为项添加到List。

文件中有两个部分,&#34; MMap&#34;和#34; missionMMap&#34;。

有没有办法在missionMMap之后拆分列表并将其附加到另一个列表? 另一种方法是在&#34; missionMMap&#34;之后直接添加任何行。直接列出missionMMap。

我的代码:

    List<string> MMap = new List<string>();
    List<string> missionMMap = new List<string>();

    public void readFile(string path)
    {
        try
        {
            MMap.Clear();
            using (StreamReader readFile = new StreamReader(path))
            {
                string line;
                while ((line = readFile.ReadLine()) != null)
                {
                    if (!string.IsNullOrEmpty(line))
                    {
                        MMap.Add(line);
                    }
                }
            }
        }
        catch (Exception e) { MessageBox.Show(e.Message, "Error!"); }
    }

该文件如下所示:

[MMap]  SpeciesIdx
1       15
[missionMMap]   SpeciesIdx
1               15

提前致谢。 PS:我为任何语法错误道歉。

2 个答案:

答案 0 :(得分:0)

因为你有字符串[missionMMap]来分解文件中的部分应该可以解决这个问题。

using(StreamReader readFile = new StreamReader(path))
{
    string line;
    bool isMissionMMap = false;

    while((line = readFile.ReadLine()) != null)
    {
        if(!string.IsNullOrEmpty(line))
        {
            if(!isMissionMMap && line.StartsWith("[missionMMap]")) // Short circuit early if the missionMMap portion has already been entered
            {
                isMissionMMap = true;
                continue; //Ignore this line of text as it is more than likely useless
            }

            if(isMissionMMap)
            {
                missionMMap.Add(line);
            }
            else
            {
                MMap.Add(line)
            }
        }
    }
}

编辑:如果需要,您可以使用非常时髦的三元运算符替换最后的if/else语句。我不打算推​​荐它,因为它不可读,我只是添加它,因为我发现它很酷。

(isMissionMMap ? missionMMap : MMap).Add(line);

同样,我不会使用它,但它很有效。

答案 1 :(得分:0)

嵌套的if并不漂亮,但这样可行。

List<string> MMap = new List<string>();
List<string> missionMMap = new List<string>();

public void readFile(string path)
{
    try
    {
        MMap.Clear();

        // This technically doesn't need to be initialized here, but better safe...
        bool readingMMap = true;

        using (StreamReader readFile = new StreamReader(path))
        {
            string line;
            while ((line = readFile.ReadLine()) != null)
            {
                if (!string.IsNullOrEmpty(line))
                {
                    if(line.StartsWith("[MMap]"))
                    {
                        readingMMap = true;
                    }
                    else if(line.StartsWith("[missionMMap]"))
                    {
                        readingMMap = false;
                    }
                    else
                    {
                        if(readingMMap)
                            MMap.Add(line);
                        else
                            missionMap.Add(line);
                    }
                }
            }
        }
    }
    catch (Exception e) { MessageBox.Show(e.Message, "Error!"); }
}