加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果特定字符串使用linq匹配条件,如何将字符串列表拆分为

发布时间:2020-12-16 01:40:20 所属栏目:百科 来源:网络整理
导读:我有List包含{a,b,c,at,h,bt} 我喜欢拆分成List List string {{a,c},{at,{bt}}; 如果特定的字符串包含“t”我需要打破这一行我怎么能在 linq中这样做? 解决方法 好吧,有一种可怕的方式: int tCounter = 0;var groups = sequence.GroupBy(x = x.Contains("t
我有List包含{a,b,c,at,h,bt}
我喜欢拆分成List< List< string>> {{a,c},{at,{bt}};
如果特定的字符串包含“t”我需要打破这一行我怎么能在 linq中这样做?

解决方法

好吧,有一种可怕的方式:

int tCounter = 0;
var groups = sequence.GroupBy(x => x.Contains("t") ? ++tCounter : tCounter)
                     .Select(group => group.ToList())
                     .ToList();

或等效(但没有调用Select):

int tCounter = 0;
var groups = sequence.GroupBy(x => x.Contains("t") ? ++tCounter : tCounter,(count,group) => group.ToList())
                     .ToList();

这依赖于GroupBy子句中的副作用 – 这是一个非常糟糕的主意. LINQ是围绕功能理想设计的,其中查询不应具有副作用.您将副作用放在使用查询的代码中,而不是在查询本身中.这会有效,但我不建议.

这是一个简短而完整的演示,只是为了证明它确实有效:

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        var input = new List<string>{"a","b","c","at","h","bt"};

        int tCounter = 0;
        var groups = input.GroupBy(x => x.Contains("t") ? ++tCounter : tCounter)
                          .Select(group => group.ToList())
                          .ToList();
        foreach (var list in groups)
        {
            Console.WriteLine(string.Join(",",list));
        }
    }
}

输出:

a,c
at,c
bt

我们真正需要的是“扫描”(又名foldl,我相信 – 不确定)操作符 – 如聚合,但提供运行聚合.然后扫描可以跟踪当前Ts的数量以及当前值,GroupBy可以对此进行处理.

编写这样的运算符并不难,而IIRC是Reactive Extensions System.Interactive assembly已经包含了一个.您可能想要使用它而不是我可怕的笨蛋黑客.那时你实际上可以在LINQ中合理地编写它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读