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

时间:2010-09-29 12:04:29

标签: c# linq list

我想避免循环

我有这个:

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

对于Linq,我想要2个List

第一个:AAAA,BBBB和CCCCC

在第二个:12,34和56

它不是基于数字而非数字。

谢谢,

8 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分: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;
    });

根据LINQPad,结果如下: alt text

当然我可能不会这样做,因为它有点难以阅读。对于要附加到哪个列表的测试是,不好

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

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

答案 2 :(得分: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);

答案 3 :(得分:2)

我不确定你的最终目标是什么,但你可以试试这个:

var strings = s.Split(',').Where( (s,p) => p % 2 == 0)

答案 4 :(得分:1)

对于那些感兴趣的人来说,这是isnumeric而不是数字过滤器......我意识到它不需要

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

Regex  _isNumber = new Regex(@"^\d+$");

string[] y = x.Split(',') .Where(a => _isNumber.IsMatch(a)).ToArray();
string[] z  =x.Split(',') .Where(a => !_isNumber.IsMatch(a)).ToArray();

答案 5 :(得分:1)

你可以对你在小组中列出的位置和分配进行分组,如下所示:

        public IEnumerable<IEnumerable<T>> ToLists<T>(IEnumerable<T> sequence)
        {
            var res = sequence.Select((item, position) => new { Item = item, Position = position })
                              .GroupBy(pair => pair.Position % 2 == 0,pair => pair.Item);
            return from grouping in res
                   select grouping;
        }

如果您希望列表具有不同的类型,则可以遍历结果。 这就是为什么返回类型不是IEnumerable&gt;但IEnumerable&gt;。使用ToList将迭代序列,但如果你想对每个元素执行某些操作,你也可以合并这些动作,通过sequnce superflourious进行一次迭代

答案 6 :(得分:0)

非常有趣,没有副作用,也没有方法调用。

"TesteDessaBudega".Aggregate(new List<List<char>>(), 
(l, c) => char.IsUpper(c) ? 
    l.Union(
        new List<List<char>>(){
            new List<char>(){c}
        }
    ).ToList() : 
    l.Take(l.Count - 1).Union(
        new List<List<char>>(){
            l.Last().Union(
                new List<char>(){c}
            ).ToList()
        }
    ).ToList() 
)

哦,在vbnet上只是为了更有趣。

"TesteDessaBudega".Aggregate(New List(Of List(Of Char))(), 
Function(l, c) If(Char.IsUpper(c),
    l.Union(
        New List(Of List(Of Char))(New List(Of Char)(){
            New List(Of Char)(New Char(){c})
        })
    ).ToList(),
    l.Take(l.Count - 1).Union(
        New List(Of List(Of Char))(New List(Of Char)(){
            l.Last().Union(
                New List(Of Char)(New Char(){c})
            ).ToList()
        })
    ).ToList() 
))

linqresult

答案 7 :(得分:-1)

如果列表没有订购,每一秒都是一个数字,你可以做这样的事情

var stringList = "AAAA,12,BBBB,34,CCCCC,56".Split(',');

var intsAsStrings = stringList.Where(
        (x) =>
        {
            int i;
            return int.TryParse(x, out i);
        }).ToList();

var strings = stringList.Where(x => !intsAsStrings.Contains(x)).ToList();