2010-04-07 5 views
2

J'ai une collection de IEnumerable<sentence> (phrase = string)IEnumerable <string> => chaîne unique []

Je veux diviser toutes les phrases à mots (ex: .Select(t => t.Split(' ')), et après cela, je besoin de regrouper cette requête par mots pour obtenir une liste de mots uniques.

S'il vous plaît, Aide

Répondre

12

Première estimation:

var uniqueWords = sentences.SelectMany(s => s.Split(' ')).Distinct(); 

Cependant, vous voulez probablement supprimer la ponctuation et aller en minuscules ainsi; vous pouvez le faire en passant plus de caractères à Split et en lui demandant de supprimer les chaînes vides, puis en appelant le ToLowerInvariant sur le résultat. Si les phrases d'entrée proviennent de SQL, ce sera IQueryable au lieu de IEnumerable, alors Linq tentera d'exécuter la requête dans la base de données, ce qui limite ce que vous pouvez faire.

Pour faire Linq exécuter en mémoire, vous donnant la pleine puissance de la BCL, utilisez:

var uniqueWords = sentences.AsEnumerable().SelectMany(s => s.Split(' ')).Distinct(); 

L'appel supplémentaire à AsEnumerable() obtient les résultats bruts de la base de données en mémoire, vous pouvez alors procéder comme Ordinaire.

+0

je suis en train d'appliquer votre code à la table (linq2sql) var uniqueWords = m_DataContext.StoreCategories.SelectMany (s => s.Name.Split (» «)) Distinct(). Mais il y a une erreur - La méthode 'System.String [] Split (Char [])' n'a pas de traduction supportée par SQL. – Maxim

+0

J'ai fait une mise à jour à ma réponse. Aussi, je vais marquer votre question de manière appropriée. –

+0

Sur ce blog est un bon aperçu (avec des images) sur comment fonctionne SelectMany ... http://www.codethinked.com/post/2010/03/12/A-Visual-Look-At-The-LINQ-SelectMany -Operator.aspx –

Questions connexes