首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据T的顺序对IEnumerable(Of T)进行划分?

如何根据T的顺序对IEnumerable(Of T)进行划分?
EN

Stack Overflow用户
提问于 2011-08-09 18:37:26
回答 1查看 294关注 0票数 0

考虑以下(字符串)IEnumerable:

代码语言:javascript
复制
    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

  • if拉里,当MoeE 210 Larry

  • all < partition

  • all >E 113LarryE 214紧跟在E 115Moe<>E 216后,当Moe<代码>E 210E 210E 113拉里时,可能会在Moe上有一个Moe

  • 分区,并将其与最后的<代码>E 121拉里拉里>E 222立即与其他任何人一起放置,Larry

  • all上的其他参数上的分区与当前的

  • all stooges (E 129MoeE 230和E 131/拉里代码><232代码>可以在代码中重复使用<代码>)。

我使用.StartsWith("Moe")等来识别走狗的类型,但是我很难弄清楚如何使用LINQ运算符来划分这个集合,这样如果Moe存在,他就代表一个分区的头,但是由于Larry必须存在于每个分区中,如果Moe没有在他前面,他可能代表分区的头。

如何创建IEnumerable(Of IEnumerable(Of String) ),以便按照用空行显示集的方式对结果进行分区?

如果这样的东西没有合适的LINQ运算符(我正在用VB.NET编程,如果VB.NET和C#之间的功能有细微的差异),我只需要编写一个方法来完成,我可以这样做,但是我认为这可能是一个出现的问题,并且很容易用LINQ运算符解决。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-09 19:06:18

LINQ在这里似乎不是一个解决方案,因为您有相当复杂的拆分条件,并且您想要生成的数据结构对于LINQ查询来说并不典型。AFAIK,唯一一次想要知道序列中多个元素的LINQ操作符是Aggregate,但是它不适合这里,因为我们正在做一些与聚合相反的事情。

因此,使用经典循环似乎可以更容易地解决您的问题,而不是像这样(没有经过彻底的测试):

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7001141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档