Bonjour, j'ai un type de recherche qui stocke des chaînes et des INTS.
static Lookup<string, int> lookup; lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number);
4 Réponses :
Jetez un oeil à la fonction prise () code> LINQ Vous devez pouvoir faire quelque chose comme
prendre (10) code> pour restituer 10 résultats. En ce qui concerne le tri, consultez la fonction
Order By () Code> qui accepte une expression Lambda en tant que mécanisme de tri. Les combiner les deux devraient vous donner ce que vous êtes après. P>
Je ne sais pas pourquoi vous casserez un lookup
lookup
Avertissement avec ce code, juste au cas où la "liste" est un ensemble de bases de données d'entités, appelant tolookup () code> similaire à
tolist () code> ne retourne pas iqueriser Pour mémoire toutes les données de la requête. Mauvaise performance pour une table avec des millions d'enregistrements.
Comment obtiendriez-vous une recherche sinon?
aller trouver une file d'attente prioritaire (vous pouvez en trouver un à http://www.itu.dk/ Recherche / C5 / ). Itérate à votre recherche et insérez un élément icomparable créé à partir de chaque entrée de la recherche, dans la file d'attente prioritaire. Sélectionnez les dix articles les plus top de la file d'attente prioritaire. Ou juste triez-les par le compte comme clé.
var lookup = list.ToLookup( l => l.IP, l => l.Number ); var topten = lookup.OrderByDescending( l => l.Count() ) .Take( 10 ); foreach (var item in topten) { Console.WriteLine( "{0}: {1}", item.Key, item.Count() ); }
Bonjour, votre réponse est correcte, mais je ne pouvais pas marquer deux réponses comme correctes. Merci beaucoup pour votre aide.
Malheureusement, les éléments à l'intérieur d'une recherche ne peuvent pas être réorganisés.
mais la méthode Tolookup () a une belle propriété que les éléments de tous les groupements ont le même ordre que les éléments de la séquence d'origine. P>
Cela signifie qu'avec une gymnastique Linq, vous pouvez réaliser ce que vous voulez en utilisant GroupBy: P>
var l = (from l in list // group elements by key group l by l.IP into g // for each group order the elements and take top 10 select new { g.Key, Items = g.OrderBy(g1 => g1.Number).Take(10)} into g2 // flaten group into an enumerable using select many from g in g2.Items select g) // get the desired lookup containing the top 10 ordered elements for each key .ToLookup(g => g.IP, g => g.Number);
Ohhh, il veut la top dix clés et non le top dix de compte? J'ai totalement manqué ça.
"Les éléments de tous les groupements ont le même ordre que les éléments de la séquence d'origine" - c'est bon à savoir.
J'essaie de comprendre cela. Pourquoi casserez-vous
i.Number code> à
chaîne code>?
Salut désolé, ça aurait dû être int. Je vais changer maintenant, aussi malade marquer une réponse quand je rentre à la maison et l'essayer ce soir. Merci beaucoup à tous.