tags:

views:

114

answers:

4

i have List of int which consists of value 0,0,0,1,2,3,4,0,0 now i like to split this into 3 lists like this list A consists 0,0,0 and List B consists 1,2,3,4 and List C consists 0,0.I know how split using if and for,but how can i do this using linq. usual format i need split in starting some zeros and in middle some values and in last some zeros i need to split this first zeros in one list ,middle values in one list and end zeros in another list as i say in example above here using linq and also i like to take the index that values.

+7  A: 

first one.

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

second one.

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

third one.

myList.SkipWhile(x => x==0).SkipWhile(x => x!= 0)
Jamiec
A: 

You can use the Skip and Take methods exposed by Linq to Objects to grab certain elements of a sequence.

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);
Andy Rose
A: 

You can use Take(n) or Skip(n) in linq

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);
anishmarokey
A: 

If you want to split by zero sequence then try this code:

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();
}

Output is:

0;0;0;
Count:3

1;2;3;4;
Count:4

0;0;
Count:2

It is really not clear what is a criteria of split from your question. If I gave wrong answer then explain your question.

Pavlo Neyman