按每个x索引出现对列表的一些字符串进行分组

时间:2013-03-31 20:05:04

标签: c# linq

var strings = new List<string> 
{ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p" };

int rotation = 4; // could also be 1,2,3,4,5,6,7,8 but 4 is for the sample

我想查询字符串列表并返回包含此数据的匿名类型的分组列表:

group0: a,b,c,d,i,j,k,l
group1: d,e,f,g,m,n,o,p

如果轮换 2 ,那将是另一个示例:

group0: a,b,e,f,i,j,m,n
group1: c,d,g,h,k,l,o,p

不知何故,我必须检查每个字符串及其索引位置,找到一个聪明的算法并将其与4的旋转相结合。

3 个答案:

答案 0 :(得分:2)

使用选择接受索引参数的版本。然后取mod(%)运算符,看看结果数是偶数还是奇数。 (index%size%2 == 0)。

您可以选择具有值的元组或匿名类型,以及它是偶数/奇数。然后GroupBy使用偶数/奇数作为组键,并将值作为组值。

values.Select ((value, index) => 
    new 
    {
        Value = value,
        First = index % size % 2 == 0
    }
).GroupBy(pair => pair.First, pair => pair.Value)

答案 1 :(得分:0)

也许这个:

var group0 = strings.Where((s, i) => (i/rotation)%2 == 0).ToArray();
var group1 = strings.Where((s, i) => (i / rotation) % 2 == 1).ToArray();

答案 2 :(得分:0)

var strings = new List<string> { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p" };
int rotation = 2;

int inx = 0;
var groups = strings.GroupBy(s => (inx++ / rotation)%2)
                    .Select(g => g.ToList())
                    .ToList();