Esiste un equivalente .NET di Java List.subList()
che funziona su IList<T>
?.NET equivalente di List.subList() di Java?
risposta
utilizzando LINQ
list.Skip(fromRange).Take(toRange - fromRange)
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.
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!) –
ok hai ragione. Non sono sicuro se questo è il requisito esatto, ma modifico la mia risposta per riflettere questo. – Razzie
GetRange
è la vostra risposta
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()). –
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
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). –
Restituisce una visualizzazione nell'Elenco originale o in una copia dell'intervallo? –
Funziona su IList, non solo su List, questo è quello che stavo cercando. – ripper234
@ 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