2014-05-10 2 views
4

J'essaie de supprimer tous les éléments dans un objet IDictionary qui correspondent à une condition.Supprimer tous les éléments qui correspondent à une condition dans IDictionary

E.g. l'IDictionary contient un ensemble de clés et de valeurs correspondantes (disons 80 objets). Les clés sont des chaînes, les valeurs peuvent être de différents types (pensez à extraire les métadonnées d'un fichier wtv en utilisant DirectShow).

Certaines des clés contiennent le texte "pouce", par ex. thumbsize, startthumbdate etc. Je souhaite supprimer tous les objets de l'IDictionary dont les clés contiennent le mot thumb.

La seule façon dont je vois ici est de spécifier manuellement chaque nom de clé en utilisant la méthode .Remove.

Existe-t-il un moyen d'obtenir tous les objets dont les clés contiennent le mot «mot» et de les supprimer de l'objet IDictionary?

Le code ressemble à ceci:

IDictionary sourceAttrs = editor.GetAttributes(); 

GetAttributes est défini comme:

public abstract IDictionary GetAttributes(); 

Je ne sais pas le contrôle de GetAttributes, il est retourne un objet IDictionary, je ne le contenu par le regarder pendant le débogage. (Probablement un Hashtable)

MISE À JOUR: Réponse finales grâce à Tim:

sourceAttrs = sourceAttrs.Keys.Cast<string>() 
       .Where(key => key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1) 
       .ToDictionary(key => key, key => sourceAttrs[key]); 
+0

De quoi s'agit-il? Si c'est un ditionary générique, vous pouvez simplement le lancer. Vous pouvez essayer de le lancer via l'opérateur 'as '. Par exemple: 'var dict = sourceAttrs comme Dictionary '. C'est nul si la distribution ne fonctionne pas. –

+0

ne sait pas, ressemble à une hashtable avec rboy

+0

S'il vous plaît, ne pas inclure d'informations sur une langue utilisée dans un titre de question, sauf si cela n'aurait pas de sens sans elle. Les balises servent à cette fin. –

Répondre

6

Vous voulez supprimer toutes les entrées où la clé contient une sous-chaîne.

Vous pouvez utiliser LINQ en gardant tout ce qui ne pas contiennent:

dict = dict 
    .Where(kv => !kv.Key.Contains("thumb")) 
    .ToDictionary(kv => kv.Key, kv => kv.Value); 

Si vous voulez une comparaison insensible à la casse, vous pouvez utiliser IndexOf:

dict = dict 
    .Where(kv => kv.Key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1) 
    .ToDictionary(kv => kv.Key, kv => kv.Value); 

Mise à jour selon à votre édition non générique:

Si c'est un non-g dictionnaire eneric comme un HashTable vous ne pouvez pas utiliser LINQ directement, mais si vous savez que la clé est un string vous pouvez utiliser requête suivante:

// sample IDictionary with an old Hashtable 
System.Collections.IDictionary sourceAttrs = new System.Collections.Hashtable 
{ 
    {"athumB", "foo1"}, 
    {"other", "foo2"} 
}; 

Dictionary<string, object> newGenericDict = sourceAttrs.Keys.Cast<string>() 
    .Where(key => !key.Contains("thumb")) 
    .ToDictionary(key => key, key => sourceAttrs[key]); 

Mais peut-être qu'il est en fait un Dictionary générique, vous pouvez essayer moulé sous pression avec le as opérateur:

var dict = sourceAttrs as Dictionary<string, object>; 

Il est nul si la conversion n'a pas fonctionné.

+0

Je ne sais pas où la méthode Where avec un objet IDictionary (j'ai inclus system.linq et en utilisant le framework client .net4) – rboy

+0

@rboy: vous avez besoin d'un dictionnaire générique comme 'IDictionary dict = new Dictionnaire () ' –

+0

Je vais éditer la question pour ajouter plus de détails, je ne sais pas ce que l'IDictionary contient. Il me est retourné par une interface abstraite. – rboy

Questions connexes