Je me demandais comment pourrais-je améliorer les performances du code ci-dessous:Performance d'un obtenir des éléments uniques/groupe par opération sur un IEnumerable <T>
public class MyObject
{
public int Year { get; set; }
}
//In my case I have 30000
IEnumerable<MyObject> data = MethodThatReturnsManyMyObjects();
var groupedByYear = data.GroupBy(x => x.Year);
//Here is the where it takes around 5 seconds
foreach (var group in groupedByYear)
//do something here.
L'idée est d'obtenir un ensemble d'objets avec année uniques valeurs. Dans mon scénario, il n'y a que 6 ans inclus dans les 30000 éléments de la liste, donc la boucle foreach sera exécutée 6 fois seulement. Nous avons donc beaucoup d'éléments à regrouper dans quelques groupes. L'utilisation de .Distinct() avec un IEqualityComparer explicite serait une alternative, mais je pense que cela ne fera aucune différence.
Je peux comprendre si 30000 articles est trop et que je devrais être heureux avec les 5 secondes que je reçois, mais je me demandais si les performances ci-dessus peuvent être améliorées.
Merci.
EDIT: Les réponses ci-dessous m'ont fait creuser un peu plus profond seulement pour réaliser que les 5 secondes que je reçois seulement heppens quand les données sont chargées dans la mémoire du DB. Le retard a été déguisé dans la boucle foreach car l'exécution différée de IEnumerable l'a retardé jusqu'à ce point me confondant pour supposer que probablement le GroupBy() pourrait être refactorisé à quelque chose de plus performant.
La question subsiste cependant, est la commande GroupBy() le moyen optimal pour atteindre les meilleures performances dans de tels cas?
curiosité, où est MethodThatReturnsManyMyObjects obtenir les objets à partir? –
Avez-vous seulement besoin des 6 valeurs uniques de l'année, ou avez-vous besoin des objets MyObject correspondant à chacune de ces 6 années? –
@Ian P: Les données sont toutes en mémoire. Ils sont obtenus à partir de la base de données et conservés en mémoire avant d'être fournis à IEnumerable ou proviennent d'un objet mémoire mis en cache. – tolism7