2010-11-22 7 views
1

Utilisation de C#supprimer des éléments d'une file d'attente qui sont présents dans une autre file d'attente

je

Queue N: 3, 4 9, 11

Queue A: 1, 2, 3, 4, 8, 9, 11, 12, 13

Je souhaite supprimer tous les éléments de la file d'attente A qui sont présents dans la file d'attente N

et se retrouver avec la file d'attente R: 1, 2, 8, 12, 13

Comment faire cela en C#

En essayant de travailler avec someones API et ils offrent un moyen d'obtenir les deux files d'attente et j'ai besoin de filtrer en fonction d'une file d'attente retournée.

Merci,

-Seth

code mis à jour Exemple:

J'utilise un type de données personnalisé ModuleDetails

Queue<ModuleDetails> defaultQueue = apiCallDefault(); 
Queue<ModuleDetails> modQueue = apiCallAllModules(); 

Répondre

6

Easiest faire avec LINQ-à-objets. ..

var qN = new Queue<int>(new[]{3, 4, 9, 11}); 
var qA = new Queue<int>(new[]{1, 2, 3, 4, 8, 9, 11, 12, 13}); 
var qR = qA.Except(qN); 

MISE À JOUR: Tant que ModuleDetails implémente IEquatable, le code ci-dessous fonctionnera très bien. Si vous ne pouvez pas modifier ModuleDetails, vous pouvez toujours fournir un IEqualityComparer comme second argument de Except, qui définit comment l'égalité est déterminée.

+0

Appelez ensuite 'new Queue (qR);' pour en faire une file d'attente et non un IEnumerable . – strager

+0

Y at-il quelque chose de différent de Linq? –

+1

@Seth: "Linq-to-Objects" signifie utiliser Linq normal sur des objets normaux ('IEnumerable '). Ceci est opposé à Linq-to-Entities ou quelque chose, qui utilise un fournisseur pour traduire les instructions Linq en SQL, plutôt que de les exécuter directement. –

0

Si vous pouvez utiliser linq, regardez la méthode Except.

int[] first = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
int[] second = new int[] {    4, 5, 6,   10 }; 

var q = first.Except(second); 
1

Il est important de noter que si votre file d'attente était remplie avec vos objets personnalisés, vous devez implémenter l'interface IEqualityComparer. Évidemment, vous n'en aurez pas besoin pour le type int car il implémente déjà l'interface.

Questions connexes