Lo que estoy buscando es una operación básica (que estoy seguro de que tengo un nombre que desconozco de atm). Tengo una matriz como:"Girar" un IEnumerable <IEnumerable <T>> 90 grados
{1,2,3}
{A, N, F}
{7,8,9}
que me gustaría mutar en
{1, A, 7}
{2, N, 8}
{3, F, 9}
(Lo anterior son solo identificadores de objetos que no son valores reales. Los objetos reales son del mismo tipo y no ordenados)
Preferiría una solución declarativa, pero la velocidad es un factor. Voy a tener que girar bastantes tablas (100k células por minuto) y una versión lenta estaría en la ruta crítica.
Sin embargo, estoy aún más interesado en una solución legible. Estoy buscando soluciones alternativas al siguiente. (Por alternativa no me refiero a variaciones, pero un enfoque diferente)
var arrays = rows.Select(row => row.ToArray());
var cellCount = arrays.First().Length;
for(var i = 0;i<cellCount;i++){
yield return GetRow(i,arrays);
}
IEnumerable<T> GetRow(int i,IEnumerable<T[]> rows){
foreach(var row in rows}{
yield return row[i];
}
}
Entre dos soluciones casi igualmente legibles me gustaría ir para el más rápido, pero la legibilidad va delante de la velocidad
EDITAR Siempre será una matriz cuadrada
Se llama transposición (http://en.wikipedia.org/wiki/Transpose) – Frank
¡No creo que pueda ser más legible que esto! – logicnp
¿Es solo para matrices cuadradas, o también para no cuadradas? –