考虑以下(字符串)IEnumerable:
Moe1
Larry1
Curly1
Shemp1
Curly1
Moe2
Larry1
Curly1
Shemp1
Curly1
Curly2
Shemp2
Curly1
Curly2
Larry2
Curly1
Larry3
Shemp1他们在这里的视觉分裂,使模式更容易看到。我想使用IEnumerable( .StartsWith()谓词)将IEnumerable(Of String)划分为( IEnumerable(Of String) )。
这些规则是:
每个分区子集都必须有一个Moe
E 210 Larry
E 115Moe<>E 216后,当Moe<代码>E 210E 210E 113拉里时,可能会在Moe上有一个Moe
E 131/拉里代码><232代码>可以在代码中重复使用<代码>)。我使用.StartsWith("Moe")等来识别走狗的类型,但是我很难弄清楚如何使用LINQ运算符来划分这个集合,这样如果Moe存在,他就代表一个分区的头,但是由于Larry必须存在于每个分区中,如果Moe没有在他前面,他可能代表分区的头。
如何创建IEnumerable(Of IEnumerable(Of String) ),以便按照用空行显示集的方式对结果进行分区?
如果这样的东西没有合适的LINQ运算符(我正在用VB.NET编程,如果VB.NET和C#之间的功能有细微的差异),我只需要编写一个方法来完成,我可以这样做,但是我认为这可能是一个出现的问题,并且很容易用LINQ运算符解决。
提前谢谢。
发布于 2011-08-09 19:06:18
LINQ在这里似乎不是一个解决方案,因为您有相当复杂的拆分条件,并且您想要生成的数据结构对于LINQ查询来说并不典型。AFAIK,唯一一次想要知道序列中多个元素的LINQ操作符是Aggregate,但是它不适合这里,因为我们正在做一些与聚合相反的事情。
因此,使用经典循环似乎可以更容易地解决您的问题,而不是像这样(没有经过彻底的测试):
public IEnumerable<IEnumerable<string>> Partition(IEnumerable<string> input)
{
var currPartition = new List<string>();
string prev = null;
foreach (var elem in input)
{
if (ShouldPartition(prev, elem))
{
yield return currPartition;
currPartition = new List<string>();
}
currPartition.Add(elem);
prev = elem;
}
yield return currPartition;
}
private bool ShouldPartition(string prev, string elem)
{
if (prev == null)
return false;
if (elem.StartsWith("Moe"))
return true;
if (elem.StartsWith("Larry"))
return !prev.StartsWith("Moe");
return false;
}https://stackoverflow.com/questions/7001141
复制相似问题