Qual è il modo migliore per rimuovere un set da una raccolta, mantenendo comunque gli elementi rimossi in una raccolta separata?Trova e rimuovi elementi dalla raccolta
Ho scritto un metodo di estensione che lo fa, ma penso che ci sia un modo migliore. Ecco la mia funzione:
public static List<T> FindAndRemove<T>(this List<T> lst, Predicate<T> match)
{
List<T> ret = lst.FindAll(match);
lst.RemoveAll(match);
return ret;
}
E si usa in questo modo:
List<String> myList = new List<String>();
myList.Add("ABC");
myList.Add("DEF");
myList.Add("ABC");
List<String> removed = myList.FindAndRemove(x => x == "ABC");
// myList now contains 1 item (DEF)
// removed now contains 2 items (ABC, ABC)
Io non sono sicuro al 100% cosa succede dietro le quinte nei metodi FindAll
e RemoveAll
, ma immagino un modo migliore sarebbe in qualche modo "trasferire" elementi da una lista all'altra.
La soluzione è la più efficiente. –
L'implementazione mi sembra soddisfacente. La copia è un'operazione poco costosa in .Net, quindi non vi è alcun motivo per il "trasferimento" (a meno che non si abbia bisogno di qualche thread/eccezione di sicurezza che un oggetto non sia mai in più di una collezione alla volta) – adrianm
Accetto. L'uso del LINQ integrato è lo scopo di semplificare la vita. Ciò che accade su behine, le scene saranno la soluzione migliore scelta dalla MS. Dato che sei in C# è bello da vedere, ma VB tu farai daisy chain alla tua query 'return = lst.FindAll (match) .RemoveAll (match)' per rimanere in linea con leggere lo stile del codice. – ppumkin