2010-03-19 11 views

risposta

16

Il comportamento definito di Enumerable.Distinct è che restituirà una raccolta non ordinata (Documentation).

Tuttavia, l'attuale implementazione di Distinct in Linq su oggetti manterrà l'ordine. Ciò non è tuttavia garantito per altri provider LINQ e il comportamento non dovrebbe essere invocato.

+0

Quindi a volte restituisce '{3, 2, 4, 10, 6, 7, 1}' (ad esempio) a volte anziché nell'ordine in cui sono stati rilevati gli articoli? Hai forse qualche link per questo o un codice di esempio? – Cornelius

+0

@Cornelius vedere la mia risposta aggiornata – JaredPar

+0

Risposta simile per Queryable.Distinct (restituisce una sequenza non ordinata) vedere [DISTINCT() e il problema ORDERBY] (// stackoverflow.com/a/12429107) –

0

In generale: no, ma nel tuo caso (con un array int): probabilmente sì. Scommetto che stanno solo enumerando la collezione e ignorando gli oggetti che hanno già incontrato. Ma non contare su questo comportamento tra diverse versioni di .NET o per diversi tipi di collezioni.

Come indicato da JaredPar nella sua risposta, il risultato è specificato come non ordinato. Se si desidera un ordinamento specifico, è necessario ordinarli in un secondo momento utilizzando qualsiasi algoritmo abbia senso per il proprio caso.

2

Penso che la parola "non ordinato" significhi lo stesso ordine della sequenza originale.
Quindi, il chiamante deve decidere se ordinare il risultato oppure no.

+3

Pensi che la parola "non ordinato" significhi "in un ordine specifico"? Questa è una cosa strana da pensare! :-) "Non ordinato" significa "in nessun ordine particolare". –

+0

@Eric: Spero che tu abbia letto questo commento. Quello che intendo è (e penso implicito), l'ordine della sequenza del valore di ritorno non viene modificato (cioè l'ordine della sequenza restituita viene mantenuto come quello della sequenza passata). Dove ho detto "non ordinato" significa in un ordine specifico? Quindi, come per il caso precedente 'int [] nums = {2, 3, 3, 4, 2, 1, 6, 7, 10};', la sequenza restituita non ordinerà il valore restituito e restituirà '2, 3,4,1,6, 7, 10'. – shahkalpesh

+3

E quell'ordine - l'ordine in cui appare la sequenza originale - è un ordine specifico, uno su milioni di possibili ordini. La documentazione del metodo non garantisce che questo ordine specifico sia quello scelto. In * pratica * viene scelto questo specifico ordine. Ma con "non ordinato" la documentazione significa che * qualsiasi ordine * può essere scelto dall'implementazione. A volte è più efficiente non conservare l'ordine originale. –

Problemi correlati