Как насчет того, чтобы сделать это параллельно, используя Interlocked.Exchange для обеспечения безопасности потоков :) Помните, что Interlocked.Exchange будет работать только со ссылочным типом (т. Е. Пара значений структуры или ключа (если не заключена в класс) не будет). работать, чтобы держать максимальное значение.
Вот пример из моего собственного кода:
//Parallel O(n) solution for finding max kvp in a dictionary...
ClassificationResult maxValue = new ClassificationResult(-1,-1,double.MinValue);
Parallel.ForEach(pTotals, pTotal =>
{
if(pTotal.Value > maxValue.score)
{
Interlocked.Exchange(ref maxValue, new
ClassificationResult(mhSet.sequenceId,pTotal.Key,pTotal.Value));
}
});
РЕДАКТИРОВАТЬ (обновлен код, чтобы избежать возможных условий гонки выше):
Вот более надежный шаблон, который также показывает выбор минимального значения параллельно. Я думаю, что это решает проблемы, упомянутые в комментариях ниже относительно возможного состояния гонки:
int minVal = int.MaxValue;
Parallel.ForEach(dictionary.Values, curVal =>
{
int oldVal = Volatile.Read(ref minVal);
//val can equal anything but the oldVal
int val = ~oldVal;
//Keep trying the atomic update until we are sure that either:
//1. CompareExchange successfully changed the value.
//2. Another thread has updated minVal with a smaller number than curVal.
// (in the case of #2, the update is no longer needed)
while (oldval > curVal && oldval != val)
{
val = oldval;
oldval = Interlocked.CompareExchange(ref minVal, curVal, oldval);
}
});