仅在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”,它将出现在每个新组的第一行。
答案 0 :(得分:2)
如果您的行以A
,B
,C
等开头,并且第一行始终包含MSH
,则可以通过第一个字母对其进行分组。
var lines = File.ReadLines("filepath")
.GroupBy(x => x[0])
.Select(x => x.ToArray())
.ToList();
结果会显示List<string[]>
。这是LINQPad
中的结果:
答案 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)
首先,要逐个添加它们,您需要两个列表:outerList
和innerList
。让我们开始声明它们
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);
}
}