使用LINQ从String列表中创建String数组列表

时间:2016-12-18 09:10:34

标签: c# linq

我有一个给定的数据(我只是在这里作为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)

4 个答案:

答案 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();

步骤如下:

  1. 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;}

  2. 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;}}

  3. Select(grp => grp.Select(g => g.value).ToArray()) =&gt;将值转换为数组,因为列表项应该是数组。
  4. 执行查询

答案 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();