C# - 在List中存储字符串

时间:2014-03-10 06:00:29

标签: c# arrays list

仅在C#上工作2周。我一直在搜索这个问题几天,找不到简单的答案,或者答案不能做我想要的。所以这里。

我正在逐行读取文本文件(没问题)。

示例:

A Line MSH
A Line 2
B Line MSH
B Line 2
B Line 3

我想将这些行存储在如下列表中;

List lStore[0,0] = A Line MSH
     lStore[0,1] = A Line 2
     lStore[1,0] = B Line MSH
     lStore[1,1] = B Line 2
     lStore[1,2] = B Line 3

我一直在使用:

 List<string[]> lStore = new List<string[](); 

定义列表。

我正在循环文件读取

while ((sFileContents = srFile.ReadLine()) != null)
{
    Boolean bMSH_Start = sFileContents.Contains("MSH");
    if (bMSH_Start)
    {
        // Every time MSH is found i want to start a new record in the list
        lStore.Add(sFileContents);
    }
    else
    {
        ????? //If not MSH then append to current record in list
    }
}

组中可以有任意数量的行,所以我区分的是“MSH”,它将出现在每个新组的第一行。

3 个答案:

答案 0 :(得分:2)

如果您的行以ABC等开头,并且第一行始终包含MSH,则可以通过第一个字母对其进行分组。

var lines = File.ReadLines("filepath")
             .GroupBy(x => x[0])
             .Select(x => x.ToArray())
             .ToList();

结果会显示List<string[]>。这是LINQPad中的结果:

enter image description here

答案 1 :(得分:1)

考虑使用List<List<string>>代替List<string[]>,因为每条记录的大小会有所不同。

List<List<string>> lStore = new List<List<string>>();

//...

while ((sFileContents = srFile.ReadLine()) != null)
{
    if (sFileContents.Contains("MSH") || !lStore.Any())
    {
        // start a new record if MSH is found
        // or this is the first line being read
        lStore.Add(new List<string>());
    }
    // Append current line to last (i.e. current) record
    lStore.Last().Add(sFileContents);
}

或者如果您已经遇到过LINQ:

int i = 0;
List<string[]> lStore = File.ReadAllLines("TextFile1.txt")
    .Select(s => new { Index = s.Contains("MSH") ? ++i : i, Line = s })
    .GroupBy(x => x.Index, (k, g) => g.Select(x => x.Line).ToArray())
    .ToList();

答案 2 :(得分:0)

首先,要逐个添加它们,您需要两个列表:outerListinnerList。让我们开始声明它们

List<List<string>> outerList = new List<List<string>>();
List<string> innerList; //inner list will be initialized inside while loop

接下来,我们将检查while循环。

while ((sFileContents = srFile.ReadLine()) != null)
  {
       Boolean bMSH_Start = sFileContents.Contains("MSH");
       if (bMSH_Start)
       { 
        //everytime MSH is found, add inner list to outer list
        //init new inner list, add new item to it
        if(innerList != null)
        {
           outerList.Add(innerList);
        }

        innerList = new List<string>();
        innerList.Add(sFileContents);
       }
       else
       {
          //if not MSH, then add to inner list
          innerList.Add(sFileContents);
       }
  }