Скажем, у меня есть класс, как это:Как ускорить это где?
class ItemLimits
{
public string strAccountNumber = string.Empty;
public string strUserCode = string.Empty;
public long lAccumulatedAmount = 0L;
}
У меня есть массив из них с 50000 элементов в нем.
У меня также есть набор данных из 50000 элементов (более или менее), и мне нужно найти элемент в массиве ItemLimits
, который соответствует этому набору данных.
Это делается в настоящее время в цикле через набор данных с этим:
ItemLimits ilItemLimit = itemlimits.Where(s => s.strUserCode.Equals(dataset[i].User_UserCode, StringComparison.CurrentCultureIgnoreCase)
&& s.strAccountNumber.Equals(strUnEditedHomingAccountNo, StringComparison.CurrentCultureIgnoreCase)).First();
strUnEditedHomingAccountNo
извлекается из набора данных ранее.
Как только я нашел ItemLimit
Мне нужно, мне нужно добавить к его lAccumulatedAmount
.
Что я видел в тестах производительности, так это то, что это очень быстро, так как цикл начинается, но с течением времени замедляется. Это линейное замедление, которое вы можете видеть на этом графике, который я сделал:
К тому времени, как я достиг ~ 40000 предметов, каждый предмет занимает ~ 40 мс для завершения. Это имеет смысл в моей голове, потому что я предполагаю, что это просто повторение элементов один за другим, пока не найдет совпадение, что, очевидно, довольно медленно с большим количеством предметов.
Количество элементов как в массиве, так и в наборе данных может сильно различаться.
Я думал о попытке сделать заказ массив и делать Array.BinarySearch
, но я не знаю, как заказать это наиболее эффективно, учитывая, что strUserCode
и strAccountNumber
оба могут изменить, и я не могу предсказать порядок набор данных.
Это самая медленная часть программы, поэтому я бы попытался ее оптимизировать (около 70% времени тратится только на это, и происходит много чего другого).
Если бы кто-нибудь мог дать мне несколько указателей на то, что я могу сделать, это было бы очень полезно.
Я использую .NET 3.5, и я не могу это изменить.
Этот вопрос не соответствует теме, потому что он принадлежит https://codereview.stackexchange.com/ – Dirk
К сожалению. Возможно ли перенести вопросы по всем направлениям или я должен удалить их и попросить их? – Logan
Я не знаю, может быть, модератор может это сделать. – Dirk