Я класс с именем цвета, который реализует следующие переопределения:словарь и Caching
public override Int32 GetHashCode()
{
unchecked
{
Int32 hash = 23;
hash = (hash * 37) + m_Changes.GetHashCode();
hash = (hash * 37) + m_Blue;
hash = (hash * 37) + m_Green;
hash = (hash * 37) + m_Random;
hash = (hash * 37) + m_RandomBlue;
hash = (hash * 37) + m_RandomGreen;
hash = (hash * 37) + m_RandomRed;
hash = (hash * 37) + m_Red;
return hash;
}
}
Я пытаюсь кэшировать результаты приходят для того, чтобы сократить расчеты:
public static Color Average(Color left, Color right, Double weight)
{
Color value;
Int32 key = left.GetHashCode()^right.GetHashCode()^weight.GetHashCode();
if (!s_Averages.TryGetValue(key, out value))
{
Double complement = 100.0 - weight;
Int32 red = (Int32)(((left.Red * complement) + (right.Red * weight))/100.0);
Int32 green = (Int32)(((left.Green * complement) + (right.Green * weight))/100.0);
Int32 blue = (Int32)(((left.Blue * complement) + (right.Blue * weight))/100.0);
Int32 random = (Int32)(((left.Random * complement) + (right.Random * weight))/100.0);
Int32 randomRed = (Int32)(((left.RandomRed * complement) + (right.RandomRed * weight))/100.0);
Int32 randomGreen = (Int32)(((left.RandomGreen * complement) + (right.RandomGreen * weight))/100.0);
Int32 randomBlue = (Int32)(((left.RandomBlue * complement) + (right.RandomBlue * weight))/100.0);
value = new Color(red, green, blue, randomRed, randomGreen, randomBlue, random, (left.Changes || right.Changes));
s_Averages.Add(key, value);
}
return value;
}
Результат Нехорошо, потому что я получаю неправильные пиксели, когда рисую усредненные цвета на экране. Если я возвращаюсь метод к cacheless версии все работает отлично:
public static Color Average(Color left, Color right, Double weight)
{
Double complement = 100.0 - weight;
Int32 red = (Int32)(((left.Red * complement) + (right.Red * weight))/100.0);
Int32 green = (Int32)(((left.Green * complement) + (right.Green * weight))/100.0);
Int32 blue = (Int32)(((left.Blue * complement) + (right.Blue * weight))/100.0);
Int32 random = (Int32)(((left.Random * complement) + (right.Random * weight))/100.0);
Int32 randomRed = (Int32)(((left.RandomRed * complement) + (right.RandomRed * weight))/100.0);
Int32 randomGreen = (Int32)(((left.RandomGreen * complement) + (right.RandomGreen * weight))/100.0);
Int32 randomBlue = (Int32)(((left.RandomBlue * complement) + (right.RandomBlue * weight))/100.0);
return (new Color(red, green, blue, randomRed, randomGreen, randomBlue, random, (left.Changes || right.Changes)));
}
Это может означать только то, что они ключ я произвожу с помощью GetHashCode не является уникальным. Как я могу управлять таким кешем, получая уникальный ключ для средних значений цвета?
Почему именно? D: –
например: почему, по вашему мнению, это подходящий и уникальный ключ ?: Int32 key = left.GetHashCode()^right.GetHashCode()^weight.GetHashCode(); –
Ну, я так не думаю о том, что это производит ... вот почему я пытаюсь найти хорошее решение ... –