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所说的那样,我还喜欢使用该值的索引。第一个C# 如何使用linq拆分列表,c#,linq,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所说的那样,我还喜欢使用该值的索引。第一个 myList.TakeWhile
myList.TakeWhile(x => x==0)
第二个
myList.SkipWhile(x => x==0).TakeWhile(x => x!= 0)
第三个
myList.SkipWhile(x => x==0).SkipWhile(x => x!= 0)
您可以使用Linq向对象公开的Skip和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);
您可以在linq中使用take或Skipn
如果要按零序拆分,请尝试以下代码:
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
从你的问题中分离出来的标准是什么,真的不清楚。如果我给出了错误的答案,请解释您的问题。您还没有说明要如何分割数据。为什么要这样分割,而不是说,{0,0,0,1},{2,3,4,0},{0}?请给我们更多关于分割标准的细节。它只是由零和非零组成的独立序列吗?
0;0;0;
Count:3
1;2;3;4;
Count:4
0;0;
Count:2