我有一个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而且我喜欢采用值的索引。
答案 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);