2012-05-23 15 views
5
private readonly ConcurrentDictionary<string, System.Drawing.Color> _colorSet;  

public void BuildColorSet(IList<string> colorNames, string prefix, bool forceLastToGray) 
{ 
    var size = forceLastToGray ? colorNames.Count - 1 : colorNames.Count; 

    int nbHue = 6; 
    int nbCycle = (int)Math.Ceiling((double)size/nbHue); 

    var saturationMax = nbCycle <= 2 ? 1.0 : 1.0; 
    var saturationMin = 0.3; 
    var luminanceMax = nbCycle <= 2 ? 0.85 : 0.85; 
    var luminanceMin = 0.3; 
    var maxSaturationShift = 0.30; 
    var maxLuminanceShift = 0.15; 

    var interval = 1.0/Math.Min(size, nbHue); 

    var saturationShift = (saturationMax - saturationMin)/(nbCycle - 1); 
    saturationShift = Math.Min(saturationShift, maxSaturationShift); 
    var luminanceShift = (luminanceMax - luminanceMin)/(nbCycle - 1); 
    luminanceShift = Math.Min(luminanceShift, maxLuminanceShift); 

    var hueShift = 0.0; 

    var saturation = saturationMax; 
    var luminance = luminanceMax; 
    for(var i = 0; i<size; i++) 
    { 
     if(i > 0 && (i % nbHue == 0)) // Next Cycle 
     { 
      saturation -= saturationShift; 
      luminance -= luminanceShift; 
      hueShift = hueShift == 0 ? interval/2 : 0; 
     } 
     var hue = interval*(i%nbHue) + hueShift; 

     System.Drawing.Color color = HSL2RGB(hue, saturation, luminance); 

    _colorSet.AddOrUpdate(prefix + colorNames[i], color, ???); 
    } 
    if(forceLastToGray) 
    { 
     _colorSet.TryAdd(prefix + colorNames[colorNames.Count - 1], System.Drawing.Color.LightGray); 
    } 

    _cssDirty = true; 
} 

Quiero ser capaz de actualizar el diccionario si el color existe con un nuevo valor. Y también agregue al diccionario si el color no está allí en el diccionario.
Estoy usando AddOrUpdate pero no puedo obtener el tercer parámetro (forma la expresión lambda O método delegado) del método AddOrUpdate.
¿Alguna idea de cómo sería mi tercer parámetro?Diccionario concurrente Método AddOrUpdate 3er parámetro?

+0

No tengo idea de lo que estás preguntando. ¿Revisaste la documentación? http://msdn.microsoft.com/en-us/library/ee378665.aspx – asawyer

+0

¿ves el ??? en AddOrUpdate. Ese es el parámetro que me falta. Alguna idea de cómo puedo formar ese parámetro. – Ruruboy

+1

Sí - Lea la documentación. – asawyer

Respuesta

16

Desde el documentation:

updateValueFactory Tipo: System.Func La función que se utiliza para generar un nuevo valor para una clave existente basada en la clave del existente valor

Esto dejará el valor de la colección solo si ya existe:

_colorSet.AddOrUpdate(prefix + colorNames[i], color, 
      (key, existingVal) => 
      { 
       return existingVal; 
      }); 

Esto reemplazará el valor de la colección con el mismo que se especifica para la inserción:

_colorSet.AddOrUpdate(prefix + colorNames[i], color, 
      (key, existingVal) => 
      { 
       return color; 
      }); 

Puede realizar la lógica condicional, la comparación entre el valor antiguo y el nuevo valor, o actualizar el objeto original en la función, por ejemplo.

_colorSet.AddOrUpdate(prefix + colorNames[i], color, 
      (key, existingVal) => 
      { 
       if (existingVal.Name == "Red") 
        return existingVal; 
       else 
        return color; 
      }); 
+0

La clave en el ConcurrentDictionary es prefijo + colorNames [i], y value = color es System.Drawing.Color.¿Alguna idea de qué clave, existingVal sería? – Ruruboy

+0

"clave" sería la clave del elemento existente que coincide con esa clave, por lo que un valor igual a prefix + colorNames [i]. existingValue será el objeto System.Drawing.Color que ya existe en el diccionario para la clave: prefix + colorNames [i]. Por lo tanto, en su caso, la clave es una cadena y existingVal es un System.Drawing.Color. Los tipos de datos son genéricos en función de cómo haya declarado los tipos de datos genéricos de la variable de objeto ConcurrentDictionary. – ulty4life

1

De acuerdo con la página web asawyer te di, lo que se requiere es una función

Func<TKey, TValue, TValue> 

En este caso parece que está de paso en una cadena y un color, sino la forma en que desea peinado ellos es en gran medida hasta que . Necesita una función que devuelva un Color para que lo siguiente funcione desde una perspectiva de sintaxis.

(key, oldValue) => oldValue 

No tengo idea de a quién se puede calcular el nuevo valor. Por ejemplo, podría utilizar su nuevo color

_colorSet.AddOrUpdate(prefix + colorNames[i], color, (key, oldValue) => color); 
+0

The String is the KEY y el Color es el Valor. Cualquier idea de lo que será la expresión - me refiero a la (clave, valor anterior) => color – Ruruboy

0

Parece que no le importa si el color ya está allí; siempre quiere actualizar el valor en el diccionario. En ese caso, es mejor que use el indexador normal, p.

_colorSet[prefix + colorNames[i]] = color; 
Cuestiones relacionadas