2010-11-24 5 views
5

Me encuentro escribiendo esto con bastante frecuencia.Método nativo de C# .NET para verificar si existe un artículo en la colección antes de agregar

Hashtable h = new Hashtable(); 
string key = "hahahahaahaha"; 
string value = "this value"; 
if (!h.Contains(key)) 
{ 
    h.Add(key, value); 
} 

¿Hay un método nativo (tal vez algo así como addif() ??) que comprueba si existe en la colección y si no lo hace, lo añade a la colección? Entonces mi ejemplo cambiaría a:

Hashtable h = new Hashtable(); 
string key = "hahahahaahaha"; 
string value = "this value"; 
h.AddIf(key, value); 

Esto se aplicaría más allá de una Hastable. Básicamente cualquier colección que tenga un método .Add.

EDIT: Actualización para agregar un valor cuando se añade a la tabla hash :)

Respuesta

10

Bueno, probablemente no escriba ese código, porque Hashtable usa pares de clave/valor, no solo claves.

Si está usando .NET 3.5 o superior, le sugiero que use HashSet<T>, y luego puede llamar incondicionalmente al Add - el valor de retorno indicará si realmente se agregó o no.

EDITAR: Bien, ahora sabemos que está hablando de pares clave/valor: no hay nada incorporado para un complemento condicional (bueno, existe en ConcurrentDictionary IIRC, pero ...), pero si usted está feliz para sobrescribir el valor existente, sólo puede utilizar el indexador:

h[key] = value; 

a diferencia Add, que no será una excepción si ya hay una entrada para la tecla - sólo va a reescribir.

+0

Gracias por la respuesta Jon y estás en lo correcto. Estaba trabajando con un Hashtable y estaba usando claves Y valores. Cuando fui a escribir esta pregunta, me adelanté :) –

+0

@rodey: ¿Entonces es necesario que compruebes que el valor sea el mismo? –

+0

Mi pregunta no era específica de la Hashtable. Puede ser un Hashtable, Dictionary, List, etc. Todas las colecciones que mencioné tienen un método .Add y ahí es donde quería saber si existía algo así como un AddIf para estas colecciones. –

8

No hay un procedimiento de este tipo en el marco .NET. Pero se puede escribir fácilmente su propio método de extensión:

public static void AddIfNotExists<T>(this ICollection<T> coll, T item) { 
    if (!coll.Contains(item)) 
     coll.Add(item) 
} 

Para IDictionary, utilizo este método (generalmente para Dictionary<TKey, List<TValue>> y variaciones):

public static TValue AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key) 
    where TValue : new() 
{ 
    TValue value; 
    if (!dict.TryGetValue(key, out value)) 
    { 
     value = new T(); 
     dict.Add(key, value); 
    } 
    return value; 
} 
+1

1 Además asegúrese de que es igual a/de hash se define para el tipo de ofrecer espera que contiene el comportamiento, a menos que la misma referencia es todo lo que se importaba. –

0

Su código no tiene sentido, ya que un HashTable necesita una clave y un valor.

Si se refería a HashSet<T>, llamar al Add no hará nada si el artículo ya está allí.

Si se refería a Dictionary<TKey, TValue>, puede escribir dict[key] = value, que agregará la clave si no está presente o la sobrescribirá si es así.

+0

Estás en lo correcto.Me adelanté a mí mismo al escribir el ejemplo. Actualicé mi código –

0

Hasta ahora no es así. Pero podría escribir su propio método de extensión para envolver esto en una sola línea.

1

Para una tabla hash se podría escribir myHashtable[key] = myHashtable[key] ?? newValue donde el lado derecho en primer lugar comprobar si myHashtable[key] evaluados en nulo y si no se resuelve a que de otra manera resolver a newVale

0

A menudo escribo un método similar en mi costumbre Diccionario/Hashtable colecciones, como Type FetchOrCreate(Key), no como un void AddIf(Key)

Cuestiones relacionadas