Il titolo suggerisce che ho già un'idea di cosa sta succedendo, ma non riesco a spiegarlo. Ho cercato di ordinare uno List<string[]>
dinamicamente da ogni "colonna", iniziando dal primo e finendo con il minimo Length
di tutti gli array.L'esecuzione differita di For-Loop e LINQ non funziona bene insieme
Quindi, in questo campione è 2
, perché l'ultima string[]
ha solo due elementi:
List<string[]> someValues = new List<string[]>();
someValues.Add(new[] { "c", "3", "b" });
someValues.Add(new[] { "a", "1", "d" });
someValues.Add(new[] { "d", "4", "a" });
someValues.Add(new[] { "b", "2" });
Ora ho cercato di ordinare tutto dalla prima e seconda colonna. Potrei farlo in modo statico in questo modo:
someValues = someValues
.OrderBy(t => t[0])
.ThenBy(t => t[1])
.ToList();
Ma se non so il numero di "colonne" potrei usare questo ciclo (che è quello che ho pensato):
int minDim = someValues.Min(t => t.GetLength(0)); // 2
IOrderedEnumerable<string[]> orderedValues = someValues.OrderBy(t => t[0]);
for (int i = 1; i < minDim; i++)
{
orderedValues = orderedValues.ThenBy(t => t[i]);
}
someValues = orderedValues.ToList(); // IndexOutOfRangeException
Ma questo non funziona, fallisce con uno IndexOutOfRangeException
nell'ultima riga. Il debugger mi dice che i
è 2
in quel momento, quindi la condizione del ciclo sembra essere ignorata, i
è già == minDim
.
Perché è così? Qual è il modo corretto per questo?
_ "Il ciclo" for "non verrà modificato." _ Quindi, anche se sto ancora utilizzando .NET 4, questo problema riguarda anche le persone che stanno già utilizzando C# 5. –
Sì, questo è uno dei problemi con il cambio di rotta di foreach-loop in C# 5. In un modo che ora si comportano in modo diverso rispetto a for-loops. – Dirk