У меня есть массив пользовательских объектов с именем AnalysisResult
. Массив может содержать сотни тысяч объектов; и, иногда мне нужны только элементы Distinct()
этого массива. Итак, я написал класс пункт Comparer называется AnalysisResultDistinctItemComparer
и сделать свой вызов, как это:Как сообщить о прогрессе в длинном вызове .Distinct() в C#
public static AnalysisResult[] GetDistinct(AnalysisResult[] results)
{
return results.Distinct(new AnalysisResultDistinctItemComparer()).ToArray();
}
Моя проблема в том, что этот вызов может занять длительное время (порядка нескольких минут), когда массив является особенно большой (более 200 000 объектов).
В настоящее время я вызываю этот метод в фоновом работнике и показываю вращающийся gif, чтобы предупредить пользователя о том, что этот метод выполняется, и что приложение не заморожено. Все это прекрасно и хорошо, но это не дает пользователю никаких указаний на текущий прогресс.
Мне действительно нужно уметь указывать пользователю текущий ход этого действия; но я не смог придумать хороший подход. Я играл с делать что-то вроде этого:
public static AnalysisResult[] GetDistinct(AnalysisResult[] results)
{
var query = results.Distinct(new AnalysisResultDistinctItemComparer());
List<AnalysisResult> retVal = new List<AnalysisResult>();
foreach(AnalysisResult ar in query)
{
// Show progress here
retVal.Add(ar);
}
return retVal.ToArray();
}
Но проблема в том, что у меня нет возможности узнать, что мой фактический прогресс. Мысли? Предложения?
Проблема, которую, я думаю, вам понадобится, заключается в том, что вам нужно знать, сколько разных значений у вас впереди, чтобы установить максимальное значение индикатора прогресса. Вы, конечно, не будете знать это значение, пока ваш запрос не будет запущен ... Вы всегда можете попробовать и ускорить этот процесс, используя некоторый параллализм (не уверенный в своей структуре) http://msdn.microsoft.com/ru -us/library/dd383943.aspx – Damon