12
votes

Comment trier une recherche?

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);


2 commentaires

J'essaie de comprendre cela. Pourquoi casserez-vous i.Number à chaîne ?


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.


4 Réponses :


0
votes

Jetez un oeil à la fonction prise () LINQ Vous devez pouvoir faire quelque chose comme prendre (10) pour restituer 10 résultats. En ce qui concerne le tri, consultez la fonction Order By () 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.


0 commentaires

4
votes

Je ne sais pas pourquoi vous casserez un lookup à un lookup , mais la réponse générale que vous voulez est: xxx


2 commentaires

Avertissement avec ce code, juste au cas où la "liste" est un ensemble de bases de données d'entités, appelant tolookup () similaire à tolist () 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?



1
votes

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() );
}


1 commentaires

Bonjour, votre réponse est correcte, mais je ne pouvais pas marquer deux réponses comme correctes. Merci beaucoup pour votre aide.



5
votes

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);


2 commentaires

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.