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中合理地编写它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |