您的规范不完整。你想用这个输入做什么:
Level 01
Level 02
-- Blank Line --
Level 03
Level 04
-- Blank Line --
那么两个连续的空行呢?
Level 01
Level 01
-- Blank Line --
-- Blank Line --
Level 02
如果你的输入序列是空的,你想要什么?一个空的输出,还是只有一个空行?
假设你没有这个。你的要求是:
给定一个字符串的输入序列,没有两个连续的空行。取第一个字符串,跳过所有字符串,直到第一个空字符串。取空字符串。重复此操作直到序列结束。
所以你取第一个“Level 01”,跳过所有行,直到空行,你取空行,然后是第一行:“Level 02”。跳过所有行直到下一个空行,取下一个空行,等等。
可能“空字符串”实际上是“-- 空白行--”。我假设您足够聪明,可以相应地更改代码。
您可以在一个大的 LINQ 语句中做到这一点。我认为如果您制作扩展方法,您的代码将更容易阅读、理解、重用、测试和维护。如果你不熟悉扩展方法,请参阅extension methods demystified
static IEnumerable<string> SkipContiguousLines(this IEnumerable<string> source)
{
// TODO implement
}
我们先看看界面是否如你所愿:
IEnumerable<string> lines = ... // get the input
IEnumerable<string> remainingLines = lines.SkipContiguous();
或者在更大的 LINQ 中:
var result = orderLines.GroupBy(orderLine => orderLine.OrderId)
.Select(group => new
{
OrderId = group.Key,
OrderLines = group.SkipContiguous(),
});
代码相当简单:
static IEnumerable<string> SkipContiguousLines(this IEnumerable<string> lines)
{
string blankLine = String.Empty; // or ----- Blank Line ---- ?
using (var lineIterator in lines.GetEnumerator())
{
bool lineAvailable = lineIterator.MoveNext();
while (lineAvailable)
{
// there is still something in your input:
yield return lineIterator.Current;
// skip until blank line:
while (lineAvailable && lineIterator.Current != blankLine)
{
lineAvailable = lineIterator.MoveNext();
}
// if not at end, you found a blank line: return the blank line
if (lineAvailable) yield return blankLine;
}
}
}