如何使用linq拆分列表

时间:2010-10-07 09:09:39

标签: c# linq

我有一个int的列表,它由值0,0,0,1,2,3,4,0,0组成,现在我想将它拆分为3个列表,如此列表A包含0,0,0和列表B由1,2,3,4组成,列表C由0,0组成。我知道如何使用if和for进行拆分,但是如何使用linq进行拆分。通常的格式我需要拆分开始一些零和中间一些值,最后一些零我需要在一个列表中拆分这个第一个零,一个列表中的中间值和另一个列表中的结束零,正如我在上面的例子中所说的使用linq而且我喜欢采用值的索引。

4 个答案:

答案 0 :(得分:7)

第一个。

myList.TakeWhile(x => x==0)

第二个。

myList.SkipWhile(x => x==0).TakeWhile(x => x!= 0)
第三个。

myList.SkipWhile(x => x==0).SkipWhile(x => x!= 0)

答案 1 :(得分:0)

如果要按零序分割,请尝试以下代码:

static void Main(string[] argv)
{

    var list = new[] { 0, 0, 0, 1, 2, 3, 4, 0, 0 };

    int groupIndex = 0;
    var result = list.Select(
        (e, i) =>
            {
                if (i == 0)
                {
                    return new {val = e, group = groupIndex};
                }
                else
                {
                    groupIndex =
                        (e != 0 && list[i - 1] == 0) || (e == 0 && list[i - 1] != 0)
                            ?
                                groupIndex + 1
                            : groupIndex;

                    return new {val = e, group = groupIndex};
                }
            }
        ).GroupBy(e => e.group).Select(e => e.Select(o => o.val).ToList()).ToList();

    foreach (var item in result)
    {
        foreach (var val in item)
        {
            Console.Write(val + ";");
        }
        Console.WriteLine();
        Console.WriteLine("Count:" + item.Count);
        Console.WriteLine();
    }

    Console.ReadLine();
}

输出是:

0;0;0;
Count:3

1;2;3;4;
Count:4

0;0;
Count:2

目前尚不清楚从您的问题中拆分的标准是什么。如果我给出了错误答案,请解释你的问题。

答案 2 :(得分:-1)

您可以使用Linq to Objects公开的Skip and Take方法来获取序列的某些元素。

var myList = new int[] {0,0,0,1,2,3,4,0,0};
var list1 = myList.Take(3);
var list2 = myList.Skip(3).Take(4);
var list3 = myList.Skip(7);

答案 3 :(得分:-1)

您可以在linq中使用Take(n)Skip(n)

List<int> list = new List<int>();
                list.Add(0);
                list.Add(0);
                list.Add(0);
                list.Add(1);
                list.Add(2);
                list.Add(3);
                list.Add(4);
                list.Add(0);
                list.Add(0);

                var listOne = list.Take(3);
                var listSecond = list.Skip(3).Take(4);
                var listThird = list.Skip(7);