使用Linq将字符串拆分为List <string>

Kri*_*s-I 10 c# linq list

我想避免循环

我有这个 :

string s = "AAAA,12,BBBB,34,CCCCC,56";
Run Code Online (Sandbox Code Playgroud)

有了Linq,我想要2个List

在第一个:AAAA,BBBB和CCCCC

在第二个:12,34和56

它不是基于数字或非数字.

谢谢,

Bru*_*oLM 29

您可以使用

var str = "AAAA,12,BBBB,34,CCCCC,56";

var spl = str.Split(',');
var l1 = spl.Where((x, y) => y % 2 == 0).ToList();
var l2 = spl.Where((x, y) => y % 2 == 1).ToList();
Run Code Online (Sandbox Code Playgroud)

这将检查索引是偶数还是奇数.


Dar*_*mas 8

现在让我们使用Aggregate了它的乐趣(并且也证明了这可以作为一个单独的表达式来完成):

"AAAA,12,BBBB,34,CCCC,56".Split(',').Aggregate(
    new { Uneven = new List<string>(), Even = new List<string>() },
    (seed, s) => { 
        if (seed.Uneven.Count > seed.Even.Count) 
            seed.Even.Add(s);
        else
            seed.Uneven.Add(s);
        return seed;
    });
Run Code Online (Sandbox Code Playgroud)

根据LINQPad,结果如下: 替代文字

当然我可能不会这样做,因为它有点难以阅读.而对于其中列出追加到测试,好了,不好听.

但至少我们现在有另一个lambda语句的例子- 通常LINQ文献试图忘记它们(可能是因为它们不适用于SQL或任何其他使用表达式树的后端).

与上面的清洁解决方案相反,这种方法的一个优点是,这只能使一个通过列表.既然我们正在拆分一个字符串,我会尝试优化其他地方;)不是IEnumerable<string> Split(this string self, string boundary)很酷吗?


Kla*_*sen 6

鉴于规则是您希望一个列表中的每个第二个字符串和另一个列表中的其他字符串,您可以执行以下操作:

        string s = "AAAA,12,BBBB,34,CCCCC,56";

        var parts = s.Split(',');

        var first = parts.Where((p, i) => i % 2 == 0);
        var second = parts.Where((p, i) => i % 2 == 1);
Run Code Online (Sandbox Code Playgroud)