2009-08-17 20 views

risposta

10

utilizzando LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

Restituisce una visualizzazione nell'Elenco originale o in una copia dell'intervallo? –

+0

Funziona su IList, non solo su List, questo è quello che stavo cercando. – ripper234

+1

@ Joachim Sauer: questa è una query ed il suo risultato dipende da come viene valutato. Durante la valutazione, scorre attraverso gli elementi dell'elenco applicando alcune regole. Questo non è analogo per la funzione di sottolista di Java, ed è sbagliato confrontarli in questo caso. – Kamarey

9

Per il generico List<T>, è il metodo GetRange(int, int).

Modifica: si noti che questa è una copia poco profonda, non una "vista" sull'originale. Non penso che C# offra quella funzionalità esatta.

Edit2: come sottolinea Kamarey, è possibile avere una vista di sola lettura:

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

È possibile che questo stamperà 7, 42, 9.

+2

Dalla documentazione di MSDN (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) lo fa non sembra essere lo stesso: GetRange() restituisce una copia superficiale, mentre subList() restituisce una vista (ad es. le modifiche alla sottocartella() si rifletteranno nella lista originale!) –

+0

ok hai ragione. Non sono sicuro se questo è il requisito esatto, ma modifico la mia risposta per riflettere questo. – Razzie

1

GetRange è la vostra risposta

+3

Ancora: non è esattamente * esattamente la stessa cosa, in quanto restituisce una copia superficiale invece di una vista. Restituire una vista abilita alcuni trucchi piuttosto ingegnosi (non è quindi necessario fornire un metodo RemoveRange(), poiché può essere facilmente scritto come list.subList (x, y) .clear()). –

+0

Devo dire onestamente che non vedo davvero i benefici. Inoltre, removeRange() e subList.clear() non sembrano la stessa cosa, in quanto la cancellazione non dovrebbe essere la stessa cosa della rimozione di un intervallo. Ma vabbè :-) – Razzie

+5

Non appena si strappa il concetto che subList() restituisce una vista nell'Elenco originale (e non una copia), diventerà ovvio che someList.subList (1,3) .clear() rimuovere oggetti dall'elenco originale. E la parte più importante non è se è migliore o meno, ma che subList() e GetRange() non fanno la stessa cosa, quindi non dovrebbero essere presentati come equivalenti (almeno non senza un disclaimer). –