2010-10-29 9 views
0

En se référant à ce sujet: Minimize LINQ string token counter Et en utilisant le code fourni ci-dessous:Comment énumérer les résultats Linq?

string src = "for each character in the string, take the rest of the " + 
      "string starting from that character " + 
      "as a substring; count it if it starts with the target string"; 

var results = src.Split()    // default split by whitespace 
       .GroupBy(str => str) // group words by the value 
       .Select(g => new 
           { 
            str = g.Key,  // the value 
            count = g.Count() // the count of that value 
           }); 

Je dois d'énumérer toutes les valeurs (mots-clés et le nombre d'occurrences) et les charger dans NameValueCollection. En raison de ma connaissance très limitée de Linq, je n'arrive pas à comprendre comment le faire. S'il vous plaît donnez votre avis. Merci.

Répondre

5

Je ne pense que la raison pour laquelle vous voulez mettre quoi que ce soit dans un NameValueCollection, mais est-il une raison pour laquelle

foreach (var result in results) 
    collection.Add(result.str, result.count.ToString()); 

ne suffit pas?

(EDIT:. Changé accesseur Add, qui peut être mieux pour votre cas d'utilisation)

Si la réponse est « non, ça marche », vous devriez probablement arrêter et comprendre ce que l'enfer le code ci-dessus est faire avant de l'utiliser dans votre projet.

+0

Voulez-vous utiliser collection.Add, puisque NameValueCollections peut avoir plusieurs clés? – Ocelot20

+0

Probablement, ouais. Je n'étais pas familier avec 'NameValueCollections'. Je l'ai réparé. – mquander

+1

Je comprends parfaitement ce que le code ci-dessus fait, mais la plupart du temps j'utilise un langage .NET différent, donc je suis nouveau à la fois C# et Linq :) Je ne pensais pas que c'était si simple, merci. – SharpAffair

2

On dirait que votre problème particulier pourrait tout aussi facilement utiliser un dictionnaire au lieu d'un NameValueCollection. J'oublie si cela est la syntaxe correcte ToDictionary, mais juste google la méthode ToDictionary():

Dictionary<string, int> useADictionary = results.ToDictionary(x => x.str, x => x.count); 
+0

Le deuxième argument de votre appel est une affectation au lieu d'une fonction anonyme, mais +1 pour suggérer un dictionnaire au lieu d'un NameValueCollection! – diceguyd30

+0

Et maintenant, il a été corrigé. Ne pas tenir compte du commentaire précédent jusqu'à "+1 ..." – diceguyd30

1

Vous voulez certainement Dictionary au lieu de NameValueCollection. Tout le point est d'afficher uniques jetons (string s) avec le nombre d'occurrences de chaque jeton (un int), oui?

NameValueCollection est une collection spéciale polyvalente qui nécessite cordes et clé et la valeur - Dictionary<string, int> est la façon dont grand public .Net d'associer une clé string unique avec sa valeur correspondante int. Jetez un oeil à la System.Collections namespaces différents pour comprendre ce que chacun est destiné à réaliser. Typiquement ces jours-ci, System.Collections.Generic est le plus largement vu, avec System.Collections.Concurrent pour les programmes multithread.

Questions connexes