我有一个给定的数据(我只是在这里作为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获得相同的结果。请帮忙。
感谢。
(编辑:结果应该是列表2中每个项目的A和B,C和D,E和F)
答案 0 :(得分:5)
试试这个:
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 })
=&gt;
{0,&#39; A&#39;} {0,&#39; B&#39;} {1,&#39; C&#39;} {1,&#39; D&#39;} {2 ,&#39; E&#39;} {2,&#39; F&#39;}
GroupBy(pair => pair.PairNum)
=&gt; {0:{&#39; A&#39;,&#39; B&#39;}},{1:{&#39; C&#39;,&#39; D&#39;}},{2 :{&#39; E&#39;,&#39; F&#39;}}
Select(grp => grp.Select(g => g.value).ToArray())
=&gt;将值转换为数组,因为列表项应该是数组。答案 1 :(得分:1)
通过以下技巧,这非常容易..
var result = Enumerable.Range(0,array.Count()/2)
.Select(x=>array.Skip(x*2).Take(2));
答案 2 :(得分:1)
list2 = list1.Where((x, i) => i % 2 == 0)
.Zip(list1.Where((x, i) => i % 2 == 1),
(x, y) => new[] { x, y })
.ToList();
答案 3 :(得分:1)
你想要做的是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();