2009-02-12 4 views
3

J'ai une collection. Le coll a des chaînes:GroupBy Chaîne et nombre dans LINQ

Location="Theater=1, Name=regal, Area=Area1" 

Location="Theater=34, Name=Karm, Area=Area4445" 

et ainsi de suite. Je dois extraire juste le bit Nom de la chaîne. Par exemple, ici, je dois extraire le texte «regal» et regrouper la requête. afficher le résultat que

Name=regal Count 33 
Name=Karm Count 22 

Je me bats avec la requête:

Collection.Location.GroupBy (????) (ce qu'il faut ajouter ici)

Ce qui est le plus court et une manière précise de le faire?

Répondre

10

Une autre approche LINQ + Regex:

string[] Location = { 
         "Theater=2, Name=regal, Area=Area1", 
         "Theater=2, Name=regal, Area=Area1", 
         "Theater=34, Name=Karm, Area=Area4445" 
        }; 

var test = Location.Select(
          x => Regex.Match(x, "^.*Name=(.*),.*$") 
             .Groups[1].Value) 
        .GroupBy(x => x) 
        .Select(x=> new {Name = x.Key, Count = x.Count()}); 

résultat de la requête pour les chaînes testées

1

Une fois que vous avez extrait la chaîne, tout groupe par et compter les résultats:

var query = from location in locations 
      let name = ExtractNameFromLocation(location) 
      group 1 by name in grouped 
      select new { Name=grouped.Key, Count=grouped.Count() }; 

cependant Ce n'est pas particulièrement efficace,. Il doit faire tout le groupement avant qu'il ne compte. Jetez un oeil à this VJ article pour une méthode d'extension pour LINQ to Objects, et this one about Push LINQ qui est un peu différent de LINQ.

EDIT: ExtractNameFromLocation est le code issu des réponses à votre other question, par ex.

public static string ExtractNameFromLocation(string location) 
{ 
    var name = (from part in location.Split(',') 
       let pair = part.Split('=') 
       where pair[0].Trim() == "Name" 
       select pair[1].Trim()).FirstOrDefault(); 
    return name; 
} 
+0

Qu'est-ce que ExtractNameFromLocation contient? Plz aide avec requête complète –

+0

ExtractNameFromLocation ferait exactement ce que cela ressemble - et d'autres ont fourni le code pour le faire dans votre autre question: http://stackoverflow.com/questions/539983/extract-portion-of-string –

1

Voici une autre solution LINQ alternative avec un exemple de travail.

static void Main(string[] args) 
{ 
    System.Collections.Generic.List<string> l = new List<string>(); 
    l.Add("Theater=1, Name=regal, Area=Area"); l.Add("Theater=34, Name=Karm, Area=Area4445"); 

    foreach (IGrouping<string, string> g in l.GroupBy(r => extractName(r))) 
    { 
     Console.WriteLine(string.Format("Name= {0} Count {1}", g.Key, g.Count()) ); 
    } 
} 
private static string extractName(string dirty) 
{ 
    System.Text.RegularExpressions.Match m = 
     System.Text.RegularExpressions.Regex.Match(
     dirty, @"(?<=Name=)[a-zA-Z0-9_ ]+(?=,)"); 

    return m.Success ? m.Value : ""; 
} 
+0

Une raison quelconque pour appeler ToList? Vous êtes seulement en train d'itérer sur les résultats. –

+0

Autre que la négligence? Non, j'ai mis à jour mon message, merci. – James

Questions connexes