让String数组的列表使用LINQ字符串列表

问题描述 投票:3回答:4

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

c# linq
4个回答
1
投票
list2 = list1.Where((x, i) => i % 2 == 0)
     .Zip(list1.Where((x, i) => i % 2 == 1),
           (x, y) => new[] { x, y })
           .ToList();

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 }) => {0, 'A'} {0, 'B'} {1, 'C'} {1, 'd'} {2, 'E'} {2, 'F'}
  2. GroupBy(pair => pair.PairNum) => {0:{ 'A', 'B'}},{1:{ 'C', 'd'}},{2:{ 'E', 'F'}}
  3. Select(grp => grp.Select(g => g.value).ToArray()) =>转换值数组,因为列表项应阵列。
  4. 执行查询

1
投票

这与下面的技巧超级容易..

var result = Enumerable.Range(0,array.Count()/2)
                       .Select(x=>array.Skip(x*2).Take(2));

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();
© www.soinside.com 2019 - 2024. All rights reserved.