J'ai un ConcurrentDictionary:ConcurrentDictionary.GetOrAdd(): valueFactory avec signature différente
private static ConcurrentDictionary<int, string> _cd = new ConcurrentDictionary<int, string>();
Pour être prudent, la clé réelle à utiliser pour récupérer des éléments est un objet mais je plutôt utiliser simplement son code de hachage comme la clé de sorte qu'un objet (potentiellement important) n'est pas la clé:
public static string GetTheValue(Foo foo)
{
int keyCode = foo.GetHashCode(); // GetHashCode is overridden to guarantee uniqueness
string theValue = _cd.GetOrAdd(keyCode, FooFactory);
return theValue;
}
Cependant, j'ai besoin diverses propriétés dans l'objet Foo lors de la préparation d'un objet dans l'usine:
private static string FooFactory(Foo foo)
{
string result = null;
object propA = foo.A;
object propB = foo.B;
// ... here be magic to set result
return result;
}
Étant donné que le paramètre valueFactory de GetOrAdd() s'attend à Func<int, string>
, il semble que je ne puisse pas lui transmettre mon objet Foo. Est-il possible de le faire?
Ne faites pas cela. Les HashCodes ne sont pas uniques. Vous devriez utiliser le grand objet; ça ne fera pas de mal. – SLaks
@SLaks: Supposons que j'utilise ToString() au lieu de GetHashCode(). – Bullines
** Ne le faites pas **. – SLaks