2013-01-09 14 views
15

Ho un List<Person> e invece voglio convertirli per una semplice elaborazione per un List<string>, effettuando le seguenti operazioni:Does LINQ to Objects mantenere l'ordine

List<Person> persons = GetPersonsBySeatOrder(); 
List<string> seatNames = persons.Select(x => x.Name).ToList(); 

Console.WriteLine("First in line: {0}", seatNames[0]); 

è la dichiarazione .Select() su un LINQ to Objects oggetto garantiti per non modificare l'ordine dei membri della lista? Supponendo che non sia specificato alcun distinto/raggruppamento/ordinamento

Inoltre, se una clausola arbitraria .Where() viene utilizzata per la prima volta, è comunque garantito il mantenimento dell'ordine relativo oppure talvolta utilizza filtri non iterativi?


Come già osservato in Fermin, si tratta essenzialmente di una domanda doppia. Ho fallito sulla selezione delle parole chiave corretta per la ricerca StackOverflow

Preserving order with LINQ

+5

Buoni dettagli delle query linq e ordini qui: http://stackoverflow.com/questions/204505/preserving-order-with-linq – Fermin

risposta

3

In attuazione corrente .Net esso uso tale codice. Ma non vi è alcuna garanzia che questa implementazione sarà in futuro.

private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector) 
{ 
    int index = -1; 
    foreach (TSource source1 in source) 
    { 
    checked { ++index; } 
    yield return selector(source1, index); 
    } 
} 
+2

Dubito che l'implementazione interna di un metodo così ampiamente utilizzato come .Select() essere cambiato per restituire oggetti in un ordine diverso. – Fermin

+1

Le righe del database non hanno un ordine garantito. Le liste fanno. Deve assolutamente dipendere dal tipo di raccolta sottostante (ad esempio l'enumeratore * del tipo di raccolta sottostante *) e l'ordine delle liste deve essere preservato, garantito. Select utilizza l'enumeratore del tipo List e al momento conserva l'ordine, garantito. – Triynko

2

Dipende dal tipo di raccolta sottostante più di ogni altra cosa. È possibile ottenere ordinamenti incoerenti da un hashset, ma un elenco è sicuro. Anche se l'ordine che si desidera è fornito implicitamente, è meglio definire un ordinamento esplicito se è necessario. Sembra che tu lo stia facendo giudicare dai nomi dei metodi.