我有一个给定的数据(我只是让这里作为List
)。
List<string> list1 = new List<string>();
foreach( var x in Regex.Split( "A B C D E F", " " ) )
list1.Add( x );
现在,我要让这样的最终名单。
List<string[]> list2 = new List<string[]>();
于是,我试着用这个代码(我试图与LINQ
但是,没有收获)。
int i = 0;
string[] array1 = new string[2];
foreach( var x in list1 )
{
if( i % 2 == 0 )
{
array1[0] = x;
}
else
{
array1[1] = x;
list2.Add( array1 );
array1 = new string[2];
}
i++;
}
我想使用LINQ了相同的结果。请帮忙。
谢谢。
(编辑:结果应该是A和B,C和d,在列表2 E和F为每个项目)
list2 = list1.Where((x, i) => i % 2 == 0)
.Zip(list1.Where((x, i) => i % 2 == 1),
(x, y) => new[] { x, y })
.ToList();
尝试这个:
List<string[]> list2 = list1
.Select((value, index) => new { PairNum = index / 2, value })
.GroupBy(pair => pair.PairNum)
.Select(grp => grp.Select(g => g.value).ToArray())
.ToList();
步骤如下:
Select((value, index) => new { PairNum = index / 2, value })
=> {0, 'A'} {0, 'B'} {1, 'C'} {1, 'd'} {2, 'E'} {2, 'F'}GroupBy(pair => pair.PairNum)
=> {0:{ 'A', 'B'}},{1:{ 'C', 'd'}},{2:{ 'E', 'F'}}Select(grp => grp.Select(g => g.value).ToArray())
=>转换值数组,因为列表项应阵列。这与下面的技巧超级容易..
var result = Enumerable.Range(0,array.Count()/2)
.Select(x=>array.Skip(x*2).Take(2));
你想要做什么是SelectMany
相反,对于其中有没有内置的方法。也没有办法在两个步骤也进行迭代。但是,由于您的源是一个数组,可以通过索引来访问其内容:
string[] sourceItems = sourceStr.Split(" ");
var pairQry =
from index in Enumerable.Range(0, sourceItems.Length - 1)
where index % 2 == 0
select new string[] { sourceItems[index], sourceItems[index + 1] };
List<string[]> pairs = pairQry.ToList();