Come ottenere una sottolista in C #


91

Ho un List<String>e ho bisogno di togliere un sottoelenco da questo elenco. Esistono metodi di List disponibili per questo in .NET 3.5?


Puoi mostrarci un esempio di codice di ciò che hai o chiarire? Non sto seguendo la domanda.
David

Ho una lista che dice List <String> list = new list <String> ();
devo

Risposte:


131

Vuoi List :: GetRange (firstIndex, count). 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)

È questo che stai cercando?

Se stai cercando di eliminare gli elementi della sottolista dall'elenco originale, puoi fare:

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

4
Non è possibile rimuovere elementi da un elenco mentre si scorre su di essi con un foreach .....!
slugster

Slugster; Sto iterando sulla lista "b" mentre elimino dalla lista "a". È legale :)
Josh

6

Sarebbe facile come eseguire una query LINQ nel tuo elenco?

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.
Asad Saeeduddin

@ Asad Il punto di questa risposta era illustrare che l'OP potrebbe usare LINQ. Hai sottolineato che crea una copia. Fantastico. I tuoi talenti potrebbero probabilmente essere utilizzati meglio nell'editing di questa domanda per illustrare il punto ancora più fine di quanto l'avevo lasciato 5,5 anni fa. Se lo modifichi, otterrai credito nella lega della pedanteria della giustizia di Internet e sarà ben guadagnato!
campbell

11
Io ( come altre persone ) stavo cercando qualcosa di simile a subListda Java, che espone una vista mutevole nell'elenco originale. Questo si comporta in modo diverso, il che potrebbe non essere immediatamente ovvio, quindi ho pensato che sarebbe stato utile segnalarlo a beneficio di chiunque lo vedesse in seguito. Fuori tema, potresti voler intraprendere lo yoga o la meditazione o qualcosa del genere; sei andato da 0 a pazzo rosso in faccia senza alcuna provocazione.
Asad Saeeduddin,

3

Usa la clausola Where di 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 istruzioni precedenti "p" è l'oggetto che si trova nell'elenco. Quindi, se hai utilizzato un oggetto dati, ad esempio:

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

allora il tuo linq sarebbe simile a questo:

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");

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

2

Con LINQ:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

Se hai bisogno di foreach, non c'è bisogno di ToList:

foreach (string s in l.Skip(1).Take(2)){}

Il vantaggio di LINQ è che se vuoi saltare solo qualche elemento principale, puoi:

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

cioè non c'è bisogno di occuparsi del conteggio / lunghezza, ecc.


0

La tua classe di raccolta potrebbe avere un metodo che restituisce una raccolta (una sottolista) in base ai criteri passati per definire il filtro. Crea una nuova raccolta con il ciclo foreach e distribuiscila.

Oppure, fare in modo che il metodo e il ciclo modifichino la raccolta esistente impostando un flag (proprietà) "filtrato" o "attivo". Questo potrebbe funzionare ma potrebbe anche causare problemi nel codice multithread. Se altri oggetti dipendono dal contenuto della raccolta, ciò è positivo o negativo a seconda di come si utilizzano i dati.


0

Inverti gli elementi in un sottoelenco

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


Rangeè vero con il tipo di dati intero. cosa succede se il tuo tipo di dati è DataTimee hai bisogno di recuperare un elenco di record tra due date specifiche?
Jogi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.