Wie kann ich ein Element aus der Liste von KeyValuePair entfernen?
Antworten
Zu viele Anzeigen?Wenn Sie sowohl den Schlüssel als auch den Wert haben, können Sie wie folgt vorgehen
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));
}
Dies funktioniert, weil KeyValuePair<TKey,TValue>
überschreibt nicht die Gleichheit, sondern ist eine Struktur. Das bedeutet, dass es den Standardwert Gleichheit verwendet. Dieser vergleicht einfach die Werte der Felder, um auf Gleichheit zu testen. Sie müssen also einfach eine neue KeyValuePair<TKey,TValue>
Instanz mit den gleichen Feldern.
EDITAR
Um einem Kommentator zu antworten: Welchen Wert hat hier eine Verlängerungsmethode?
Die Rechtfertigung ist am besten im Code zu sehen.
list.Remove(new KeyValuePair<int,string>(key,value));
list.Remove(key,value);
Auch für den Fall, dass entweder der Schlüssel- oder der Werttyp ein anonymer Typ ist, ist eine Erweiterungsmethode erforderlich.
EDIT2
Hier ist ein Beispiel dafür, wie man KeyValuePair, wo einer der 2 hat einen anonymen Typ zu erhalten.
var map =
Enumerable.Range(1,10).
Select(x => new { Id = x, Value = x.ToString() }).
ToDictionary(x => x.Id);
Die variable Karte ist eine Dicitonary<TKey,TValue>
donde TValue
ist ein anonymer Typ. Die Aufzählung der Map erzeugt ein KeyValuePair mit dem TValue
die denselben anonymen Typ haben.
Hier sind ein paar Beispiele für das Entfernen eines Elements aus einer Liste von 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));
EDITAR
// Remove the first occurrence where you have the item
items.Remove(items[0]);
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
KeyValuePair<string, string> kvp = list[i];
list.Remove(kvp);
oder
list.Remove(list[1]);
Sie müssen einen Verweis auf das Objekt erhalten, das Sie entfernen möchten - deshalb habe ich das gesuchte Element gefunden und einem KeyValuePair zugewiesen - da Sie ihm sagen, dass es ein bestimmtes Element entfernen soll.
Eine bessere Lösung könnte die Verwendung eines Wörterbuchs sein:
Dictionary<string, string> d = new Dictionary<string, string>();
if (d.ContainsKey("somekey")) d.Remove("somekey");
Auf diese Weise können Sie nach dem Schlüsselwert entfernen, anstatt sich damit auseinandersetzen zu müssen, dass die Liste nicht durch den Schlüssel indiziert ist.
Éditer müssen Sie nicht unbedingt zuerst eine KeyValuePair-Referenz erhalten. Dennoch ist ein Wörterbuch wahrscheinlich ein besserer Weg zu gehen.