2010-09-20 5 views
1

Je veux faire ce qui suit d'une manière performante en C#, de préférence en utilisant LINQ.Conversion efficace d'un tableau en un tableau bidimensionnel en utilisant LINQ

Array[Length] à Array[Length/Row][Row] où et sont des variables.

+0

Pourriez-vous donner un exemple de la façon dont les données que vous essayez de convertir ressemble? – roosteronacid

+0

LINQ-to-Objects traite les IEnumerable, pas directement avec les tableaux. Les tableaux bidimensionnels ne sont pas vraiment pris en charge du tout. – dtb

Répondre

3

Vous pouvez utiliser Buffer.BlockCopy pour convertir efficacement entre les tableaux n dimensions de blittable types:

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

int rows = 2; 
int columns = a.Length/rows; 
int[,] b = new int[columns, rows]; 

Buffer.BlockCopy(a, 0, b, 0, sizeof(int) * a.Length); 

// b[0, 0] == 1 
// b[0, 1] == 2 
// b[1, 0] == 3 
// b[1, 1] == 4 
// b[2, 0] == 5 
// b[2, 1] == 6 

Cela tire parti du fait que multidimensionnels (pas déchiquetées!) Des tableaux sont disposés de façon continue dans la mémoire par le CLR.

Pour les types non blittables, utilisez simplement quelques bonnes boucles for.

1

Ce n'est pas un tableau bidimensionnel, c'est un tableau irrégulier. Je suppose que vous voulez dire Array[Length/Row,Row].

Il n'y a rien dans LINQ qui fasse exactement cela, donc vous aurez un peu de surcharge si vous voulez l'utiliser. La façon la plus performante est un code simple:

public T[,] MakeRows<T>(T[] values, int rowSize) { 
    T[,] result = new T[values.Length/rowSize, rowSize]; 
    int row = 0, col = 0; 
    foreach (T value in values) { 
    resul[row, col] = value; 
    if (++col == rowsize) { 
     col = 0; 
     row++; 
    } 
    } 
    return result; 
} 

Note: La méthode suppose que les éléments sont régulièrement en lignes divisible.

Questions connexes