6
votes

Comment soustraire une liste générique d'une autre en C # 2.0

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.

Voici le workflow simplifié: xxx

getRemovablefrivelist renvoie une liste des chaînes des lettres d'entraînement amovibles. Mon idée était d'obtenir une liste de lecteurs amovibles avant le périphérique est connecté et une autre liste après 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).

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.

NOTE : Le projet cible le fichier .NET 2.0, donc pas de linq possible.

Merci!


0 commentaires

3 Réponses :


1
votes

Pour un petit nombre d'éléments, alors un foreach en boucle avec un contient appel doit faire le truc: xxx

si la collection a de nombreux éléments alors que vous pourriez faire de nombreux éléments. Recherches plus efficaces en utilisant un Dictionnaire plutôt que a Liste . (Idéalement, vous utiliseriez un hashset , mais ce n'est pas disponible dans la version 2 du cadre.)


1 commentaires

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.



3
votes

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;
}


2 commentaires

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.



1
votes

Vous pouvez travailler avec Linq Extension de la méthode de l'extension de Linq soustrayez et INSERSECT , identique à celui avec le jeu de mathématiques.

a = original.

b = après.

a - (un intersect b) = retiré de l'original B - (un insignoire B) = nouveau

var intersect = A.InterSect (B);

var retiré = a.subtract (intersect); var nouveau = b.subtract (intersect)

J'espère que cela fonctionne pour vous.


1 commentaires

LINQ n'a pas de méthode appelée soustraire (ou de substitution). Je pense que vous voulez dire sauf .