Eso es muy ineficiente en este momento - todas esas llamadas a ElementAt podrían estar pasando por la secuencia completa (tanto como lo necesiten) cada vez. (Depende de la implementación de la secuencia).
Sin embargo, no estoy del todo seguro de que entienda lo que este código está haciendo (usar bucles foreach casi con toda seguridad lo aclararía, al igual que avanzar hacia adelante en lugar de hacia atrás . Podría dar alguna entrada de la muestra y los resultados esperados
EDIT:??. de acuerdo, me parece ver lo que está pasando aquí, estás pivotante con eficacia valueCollections sospecho que querrá algo como:
static Dictionary<int, string[]> MergeArrays(
IEnumerable<int> idCollection,
params IEnumerable<string>[] valueCollections)
{
var valueCollectionArrays = valueCollections.Select
(x => x.ToArray()).ToArray();
var indexedIds = idCollection.Select((Id, Index) => new { Index, Id });
return indexedIds.ToDictionary(x => Id,
x => valueCollectionArrays.Select(array => array[x.Index]).ToArray());
}
Aunque es bastante feo. Si puedes hacer de idCollection una matriz para empezar, francamente sería más fácil.
EDIT: Bueno, suponiendo que podemos utilizar matrices en su lugar:
static Dictionary<int, string[]> MergeArrays(
int[] idCollection,
params string[][] valueCollections)
{
var ret = new Dictionary<int, string[]>();
for (int i=0; i < idCollection.Length; i++)
{
ret[idCollection[i]] = valueCollections.Select
(array => array[i]).ToArray();
}
return ret;
}
He corregido (esperemos) un error en la primera versión - Me estaba confundido entre los cuales poco de los valores era una matriz y que no fue La segunda versión no es tan declarativa, pero creo que es más clara, personalmente.
> todas esas llamadas a ElementAt van a ir a través de toda la secuencia Eso depende de lo que está llevando a cabo el IEnumerable. Si es realmente una matriz, será muy rápido. Si usa algo así como una lista vinculada, es ineficiente. –
@Dan: no sabía que Enumerable.ElementAt comprobó una implementación de IList. Eso hace una gran diferencia. Editaré –
En mi caso, tanto idCollection como valueCollections son matrices. Solo traté de hacerlo más genérico: un ejemplo clásico de tratar inútilmente de anticipar las necesidades futuras. Estas son matrices de datos de formulario a las que debo unirme, y nunca serán nada más que matrices. – Bergius