Questo è molto inefficace al momento: tutte quelle chiamate a ElementAt potrebbero passare attraverso l'intera sequenza (per quanto è necessario) ogni volta. (Dipende dall'implementazione della sequenza.)
Tuttavia, non sono affatto sicuro di aver nemmeno capito cosa stia facendo questo codice (l'uso di cicli foreach farebbe sicuramente più chiarezza, come farebbe iterando avanti invece che indietro . Potrebbe dare qualche input campione e risultati attesi
EDIT:?. va bene, mi sembra di vedere che cosa sta succedendo qui, si sta effettivamente facendo perno valueCollections ho il sospetto che si vorrà qualcosa di simile:
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());
}
E 'piuttosto brutto, se si può fare di idCollection una matrice per iniziare, sarebbe francamente più facile
EDIT: Okay, assumendo possiamo usare array invece:
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;
}
ho corretto (si spera) un bug nella prima versione - mi è stato sempre confuso tra i quali bit dei valori è un array e che non era. La seconda versione non è dichiarativa, ma penso che sia più chiara, personalmente.
fonte
2009-02-13 10:10:35
> tutte le chiamate al ElementAt andranno attraverso l'intera sequenza Questo dipende da ciò che sta attuando l'IEnumerable. Se è effettivamente un array, sarà molto veloce. Se si utilizza qualcosa come una lista collegata è inefficiente. –
@Dan: Non ero a conoscenza del fatto che Enumerable.ElementAt abbia verificato un'implementazione di IList. Questo fa una grande differenza. Modificherà. –
Nel mio caso, sia idCollection che valueCollections sono array. Ho solo cercato di renderlo più generico - un classico esempio di inutile tentativo di anticipare le esigenze future. Questi sono matrici di dati di moduli che ho bisogno di unire e non saranno mai altro che matrici. – Bergius