2009-10-22 7 views

Répondre

15

Si vous avez la clé et la valeur que vous pouvez faire la

public static void Remove<TKey,TValue>(
    this List<KeyValuePair<TKey,TValue>> list, 
    TKey key, 
    TValue value) { 
    return list.Remove(new KeyValuePair<TKey,TValue>(key,value)); 
} 

suivante Cela fonctionne parce que KeyValuePair<TKey,TValue> ne l'emporte pas sur l'égalité, mais est un struct. Cela signifie qu'il utilise la valeur par défaut égalité. Cela compare simplement les valeurs des champs pour tester l'égalité. Il vous suffit donc de créer une nouvelle instance KeyValuePair<TKey,TValue> avec les mêmes champs.

EDIT

Pour répondre à un intervenant, quelle valeur une méthode d'extension fournir ici?

La justification est mieux vu dans le code. Dans le cas où le type de clé ou de valeur est un type anonyme, une méthode d'extension est également requise.

EDIT2

Voici un exemple sur la façon d'obtenir KeyValuePair où l'un des deux a un type anonyme.

var map = 
    Enumerable.Range(1,10). 
    Select(x => new { Id = x, Value = x.ToString() }). 
    ToDictionary(x => x.Id); 

La carte variable est un Dicitonary<TKey,TValue>TValue est un type anonyme. L'énumération de la carte produira un KeyValuePair avec le TValue étant le même type anonyme.

+0

Mis à part les quelques erreurs de syntaxe contenues, quelle est la valeur de cette méthode d'extension visant à p rovide? –

+1

@Derek, supprime le besoin de spécifier des arguments génériques à une définition de type lors d'une suppression. list.Remove (clé, valeur) vs list.Remove (nouveau KeyValuePair (clé, valeur)). Le premier est beaucoup plus concis. Je ne pense pas qu'un -1 mérite une erreur de syntaxe mineure – JaredPar

+0

J'ai voté cette réponse parce que je ne pensais pas que l'utilisation d'une méthode d'extension fournissait une réponse claire et concise ou une valeur ajoutée, pas due aux erreurs de syntaxe. –

2

Doit pouvoir utiliser le .Remove(), .RemoveAt(), ou l'une des autres méthodes.

0
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(); 
    KeyValuePair<string, string> kvp = list[i]; 
    list.Remove(kvp); 

ou

list.Remove(list[1]); 

Vous devez obtenir une référence à l'objet que vous souhaitez supprimer - c'est la raison pour laquelle j'ai trouvé l'article que je suis à la recherche et affecté à un KeyValuePair - puisque vous dire pour supprimer un élément spécifique.

Une meilleure solution pourrait être d'utiliser un dictionnaire:

Dictionary<string, string> d = new Dictionary<string, string>(); 
    if (d.ContainsKey("somekey")) d.Remove("somekey"); 

Cela vous permet de supprimer la valeur clé au lieu d'avoir à faire face à la liste ne sont pas indexées par la clé.

Éditez vous ne devrez peut-être pas obtenir d'abord une référence KeyValuePair. Pourtant, un dictionnaire est probablement un meilleur moyen d'y aller.

2

Pour supprimer tous les éléments de la liste par clé:

myList.RemoveAll(x => x.Key.Equals(keyToRemove)); 
+0

Bien que n'étant pas la meilleure réponse expliquée, cela fera dans la plupart des cas le tour quand vous avez la valeur de la clé pour travailler avec. –

7

Voici quelques exemples de la suppression d'un élément dans une liste de KeyValuePair:

// Remove the first occurrence where you have key and value 
items.Remove(new KeyValuePair<int, int>(0, 0)); 

// Remove the first occurrence where you have only the key 
items.Remove(items.First(item => item.Key.Equals(0))); 

// Remove all occurrences where you have the key 
items.RemoveAll(item => item.Key.Equals(0)); 

EDIT

// Remove the first occurrence where you have the item 
items.Remove(items[0]); 
Questions connexes