2009-11-11 14 views
56

Ho un List<String> e ho bisogno di prendere un elenco secondario di questa lista. Esistono metodi di List disponibili per questo in .NET 3.5?Come ottenere un elenco secondario in C#

+0

ci mostri un esempio di codice di quello che hai, o chiarire ? Non sto seguendo la domanda. – David

+0

ya 3,5 ..sorry per l'errore di battitura .. –

+0

Ho una lista dicono List list = nuova lista (); ho bisogno di prendere un sottolista da questo elenco dire dall'indice 2 alla lunghezza-1 .. –

risposta

79

Volete List :: getRange (firstIndex, conteggio). Vedi http://msdn.microsoft.com/en-us/library/21k0e39c.aspx

// I have a List called list 
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9) 
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3) 

È quello che stai cercando?

Se stai cercando di eliminare gli elementi sottolista dalla lista originale, è possibile poi fare:

// list is our original list 
// sublist is our (newly created) sublist built from GetRange() 
foreach (Type t in sublist) 
{ 
    list.Remove(t); 
} 
+0

sì questo quello ... Ora ho bisogno di invertire il contenuto di sottolista e metterlo di nuovo alla lista originale –

+3

Non è possibile rimuovi gli oggetti da una lista mentre esegui un'iterazione su di essi con un foreach .....! – slugster

+0

Bene, dovresti essere in grado di gestire te stesso. :) – Josh

5

sarebbe facile come eseguire una query LINQ sulla vostra lista?

List<string> mylist = new List<string>{ "hello","world","foo","bar"}; 
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList(); 
+1

Questa è una copia del segmento dell'elenco originale, non una vista su una parte dell'elenco originale. –

+0

@Asad Il punto di questa risposta era di illustrare che l'OP poteva usare LINQ. Hai fatto notare che crea una copia. Fantastico. Probabilmente i tuoi talenti potrebbero essere meglio utilizzati nella modifica di questa domanda per illustrare il punto ancora più bello di come l'avevo lasciato 5.5 anni fa. Se lo modifichi, riceverai credito nella lega della pedanteria di internet, e sarà ben meritato! –

+8

I ([come alcune altre persone] (http: // stackoverflow.it/questions/1287340/net-equivalent-of-javas-list-sublist)) stava cercando qualcosa di simile a 'subList' da Java, che espone una vista mutevole nella lista originale. Ciò si comporta in modo diverso, il che potrebbe non essere immediatamente ovvio, quindi ho pensato che sarebbe stato utile indicarlo a beneficio di chiunque lo vedesse in seguito. Fuori tema, potresti voler prendere yoga o meditazione o qualcosa del genere; sei diventato pazzo in faccia senza alcuna provocazione. –

3

utilizzare la clausola Dove da LINQ:

List<object> x = new List<object>(); 
x.Add("A"); 
x.Add("B"); 
x.Add("C"); 
x.Add("D"); 
x.Add("B"); 

var z = x.Where(p => p == "A"); 
z = x.Where(p => p == "B"); 

Nelle dichiarazioni di cui sopra "p" è l'oggetto che è nella lista. Quindi, se è stato utilizzato un oggetto di dati, vale a dire:

public class Client 
{ 
    public string Name { get; set; } 
} 

allora il vostro LINQ sarebbe simile a questa:

List<Client> x = new List<Client>(); 
x.Add(new Client() { Name = "A" }); 
x.Add(new Client() { Name = "B" }); 
x.Add(new Client() { Name = "C" }); 
x.Add(new Client() { Name = "D" }); 
x.Add(new Client() { Name = "B" }); 

var z = x.Where(p => p.Name == "A"); 
z = x.Where(p => p.Name == "B"); 
+0

Dopo aver elaborato, utilizzare il mio primo esempio e aggiungere questo: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p)); – slugster

0

La classe di raccolta potrebbe avere un metodo che restituisce un insieme (un elenco secondario) sulla base di criteri passato per definire il filtro. Costruisci una nuova collezione con il ciclo foreach e distribuiscilo.

Oppure, hanno il metodo ed il ciclo modificano la collezione esistente impostando una o flag "filtrato" "attivo" (proprietà). Questo potrebbe funzionare ma potrebbe anche causare poblems nel codice multithread. Se altri oggetti sono presenti sul contenuto della raccolta, ciò è positivo o negativo a seconda di come si usano i dati.

0

invertire le voci di un elenco secondario

int[] l = {0, 1, 2, 3, 4, 5, 6}; 
var res = new List<int>(); 
res.AddRange(l.Where((n, i) => i < 2)); 
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse()); 
res.AddRange(l.Where((n, i) => i > 4)); 

Dà 0,1,4,3,2,5,6

+0

'Range' è vero con il tipo di dati intero. Cosa succede se il tuo tipo di dati è 'DataTime' e hai bisogno di recuperare un elenco di record tra due date specifiche? – Jogi

Problemi correlati