Tout d'abord, cela pourrait très bien être que je m'approche mon problème dans le mauvais sens, auquel cas j'accepterais volontiers des alternatives.
Ce que j'essaie d'atteindre, c'est de détecter quel lecteur a été créé Une fois qu'un périphérique USB a été connecté à un ordinateur. p>
Voici le workflow simplifié: p> mais je ne trouve pas un moyen simple de "soustraire" une liste d'une autre. N'importe qui pourrait suggérer une solution, voire une meilleure façon d'atteindre ce que j'essaie de faire. P> Merci! P> P> getRemovablefrivelist code> renvoie une liste des chaînes des lettres d'entraînement amovibles.
Mon idée était d'obtenir une liste de lecteurs amovibles avant em> le périphérique est connecté et une autre liste après em> il est connecté et qu'en supprimant le contenu de la première liste de la liste des Deuxièmement, je serais laissé avec des lecteurs juste connectés (normalement seulement un). P>
3 Réponses :
Pour un petit nombre d'éléments, alors un si la collection a de nombreux éléments alors que vous pourriez faire de nombreux éléments. Recherches plus efficaces en utilisant un foreach code> en boucle avec un
contient code>
appel doit faire le truc: Dictionnaire
plutôt que a Liste
. (Idéalement, vous utiliseriez un hashset
, mais ce n'est pas disponible dans la version 2 du cadre.) p> p>
J'ai choisi cette réponse parce que j'avais besoin d'une chose ponctuelle. Si j'avais besoin de le faire à plusieurs reprises et à différents endroits, j'aurais probablement mis en œuvre la soustraction de la réponse de Lee.
Un moyen général de le faire serait d'ajouter tous les éléments de la collection source à un dictionnaire, puis de supprimer des éléments de l'autre collection:
public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other) { return Subtract(source, other, EqualityComparer<T>.Default); } public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other, IEqualityComparer<T> comp) { Dictionary<T, object> dict = new Dictionary<T, object>(comp); foreach(T item in source) { dict[item] = null; } foreach(T item in other) { dict.Remove(item); } return dict.Keys; }
Une solution efficace, mais la méthode est mal nommée. Cela ne renvoie pas l'intersection des deux séquences.
Dans mon esprit, les deux réponses sont valables, mais à cause de mes besoins, j'ai choisi le moyen facile.
Vous pouvez travailler avec Linq Extension de la méthode de l'extension de Linq soustrayez fort> et INSERSECT STROR>, identique à celui avec le jeu de mathématiques. P>
a = original. P>
b = après. p>
a - (un intersect b) = retiré de l'original
B - (un insignoire B) = nouveau p>
var intersect = A.InterSect (B); P>
var retiré = a.subtract (intersect);
var nouveau = b.subtract (intersect) p>
J'espère que cela fonctionne pour vous. P>
LINQ n'a pas de méthode appelée soustraire (ou de substitution). Je pense que vous voulez dire sauf code>
.