【问题标题】:Split a List<string> after a certain line [closed]在某行之后拆分 List<string> [关闭]
【发布时间】:2014-12-02 20:56:14
【问题描述】:

我正在使用 StreamReader 每行读取一个文件,并将每一行作为一个项目添加到列表中。

文件中有两个部分,“MMap”和“missionMMap”。

有没有办法在missionMMap 之后拆分列表并将其附加到另一个列表中? 另一种方法是直接在“missionMMap”之后添加任何行以直接列出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:如有语法错误,我深表歉意。

【问题讨论】:

  • 各部分如何分隔?它只是与missionMMap 的一行,然后是该列表的项目吗?
  • 当该行等于您的值时使用一个布尔变量使其为真。如果值为 true,则开始添加到另一个列表中。
  • 不同的部分是通过在第一行包含第一个的 MMap 和第二行的missionMMap 来定义的,其余的只是数字。我尝试使用布尔值,但是 while 语句会重置布尔值,因为该部分的其余部分是数字。
  • Karim 帮助其他人在这里执行以下操作1 显示您正在解析/读取的文件的单行示例`2 解释什么是分隔符,您也可以使用一个列表 保存数据基于正确拆分行你熟悉Split 函数
  • 我编辑了问题,感谢您的提示 DJ KRAZE,不,我不熟悉拆分功能。附带说明:我做错了什么让我的问题收到负面反馈?

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


【解决方案1】:

由于您有字符串 [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);

再说一次,我不会使用它,但它的工作原理很酷。

【讨论】:

    【解决方案2】:

    嵌套的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!"); }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多