2010-06-02 5 views
13

Étant donné un IEnumerable<T> et le nombre de lignes, je voudrais le convertir en un IEnumerable<IEnumerable<T>> comme ceci:Liste des colonnes dans LINQ

Entrée:

 
Row Count: 3 

List: [1,2,3,4,5,6,7] 

Sortie

 
[ 
[1,4,7] 
[2,5] 
[3,6] 
] 

EDIT Je voudrais que cela fonctionne pour tout IEnumerable et ne dépend pas de T étant un Int32.

Comment puis-je faire cela en utilisant LINQ?

Répondre

16

Cela fera:

var list = new List<object> { 1, "two", 3, 4, 5, 6 ,7 }; 
int count = 3; 
var rows = list.Select((item, index) => new { Item = item, Index = index }) 
      .GroupBy(o => o.Index % count) 
      .Select(g => g.Select(o => o.Item)); 

Il devrait fonctionner pour tout Enumerable

+0

ce qui est ici? – VoodooChild

+0

@VoodooChild: Le type de sortie est 'IEnumerable >'. – Guffa

+0

yerp cela fait l'affaire, se demande-t-il à quel point c'est efficace, est-ce que ça marche dans la liste plus d'une fois? –

1

Cela va saisir des groupes de 3 si c'est ce que votre après?

approche Nasty bien :-)

int[] list = new [] {1,2,3,4,5,6,7}; 

    int count = 0; 

    var x = 
     from i in list.Where((c,i)=> i%3==0) 
     let grp = list.Skip(count).Take(3) 
     let temp = (count+=3) 
     select new { 
      grp 
     }; 
0

Quelque chose comme ça devrait fonctionner.

int[] list = new[] {1,2,3,4,5,6,7}; 
int[] offsets = new[] {0,1,2}; 
int[][] sorted = 
    offsets.Select((offset) => list.TakeWhile((_,ix,_) => ix % 3 == offset)) 

Avertissement: non testé. Je ne programme pas en C#, mais l'idée devrait être claire.

2
var src = new List<int> { 2, 4, 8, 16, 23, 42, 101 }; 
var i = 0; 
var answer = src.GroupBy(item => i++ % 3) 
       .Select(item => item.ToArray()) 
       .ToArray(); 

hehe, et avec cette astuce, nous pouvons éviter la variable temporaire, mais le code deviennent illisibles:

 var src = new int[] { 4, 8, 15, 16, 23, 42, 101 }; 

     var b = Enumerable.Range(0, src.Length) 
        .Select(index => index) 
        .GroupBy(index => index % 3) 
        .Select(indexes => indexes.Select(index => src[index]).ToArray()) 
        .ToArray();