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?
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?
Risposte:
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);
}
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();
subList
da 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.
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");
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.
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.
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 è DataTime
e hai bisogno di recuperare un elenco di record tra due date specifiche?