Ho una matrice di oggetti personalizzati denominati AnalysisResult
. La matrice può contenere centinaia di migliaia di oggetti; e, occasionalmente, ho bisogno solo degli elementi Distinct()
di quell'array. Così, ho scritto una classe oggetto di confronto chiamato AnalysisResultDistinctItemComparer
e fare la mia chiamata in questo modo:Come segnalare l'avanzamento di una lunga chiamata a .Distinct() in C#
public static AnalysisResult[] GetDistinct(AnalysisResult[] results)
{
return results.Distinct(new AnalysisResultDistinctItemComparer()).ToArray();
}
Il mio problema è che questo chiamata può richiedere molto tempo (nell'ordine di minuti) quando la matrice è particolarmente grande (più di 200.000 oggetti).
Attualmente chiamo questo metodo in un operatore in background e visualizzo una gif in rotazione per avvisare l'utente che il metodo viene eseguito e che l'applicazione non è stata congelata. Tutto va bene e bene, ma non fornisce all'utente alcuna indicazione del progresso attuale.
Devo davvero essere in grado di indicare all'utente l'avanzamento corrente di questa azione; ma, non sono riuscito a trovare un buon approccio. Stavo giocando con il fare qualcosa di simile:
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();
}
Ma il problema è che non ho modo di sapere ciò che il mio progresso reale è. Pensieri? Suggerimenti?
Il problema che penso si avrà è che avresti bisogno di sapere quanti valori distinti hai davanti per impostare il valore massimo dell'indicatore di progresso. Ovviamente non conoscerai questo valore fino a quando la query non sarà effettivamente in esecuzione ... Potresti sempre provare a velocizzare questo processo usando un parallelismo (non sicuro del tuo framework) http://msdn.microsoft.com/en -us/library/dd383943.aspx – Damon