2016-05-16 7 views
2

Ich habe versucht, häufigste Wörter aus einer Liste von Zeichenfolgen zu finden. Ich habe versucht, etwas wie Find the most occurring number in a List<int>Finde die häufigsten Wörter mit LINQ

aber Problem ist, dass es nur ein Wort zurückgibt, aber alle diese Wörter benötigt werden, die am häufigsten sind.

Zum Beispiel, wenn wir, dass LINQ-Abfrage auf folgende Liste aufrufen:

ans:: Dubai, Lahore

+0

Wo ist der Code, den Sie geschrieben haben, um das Problem zu lösen? –

Antwort

3

Verwenden Sie eine Gruppe, die durch und dann um

Dubai 
Karachi 
Lahore 
Madrid 
Dubai 
Sydney 
Sharjah 
Lahore 
Cairo 

es uns führen sollte nach Anzahl:

var result = list 
    .GroupBy(s => s) 
    .Where(g=>g.Count()>1) 
    .OrderByDescending(g => g.Count()) 
    .Select(g => g.Key); 
+0

Nur eine Frage ohne Bezug. Können wir die Einschränkung anwenden, nur diejenigen auszuwählen, die mehr als einmal existieren? –

+1

natürlich, es ist wie ein 'HAVING' in sql – octavioccl

2

Wenn Sie alle Wörter benötigen, die wiederholt auftreten ..

List<string> list = new List<string>(); 
      list.Add("A"); 
      list.Add("A"); 
      list.Add("B"); 
      var most = (from i in list 
         group i by i into grp 
         orderby grp.Count() descending 
         select new { grp.Key, Cnt = grp.Count() }).Where (r=>r.Cnt>1); 
1

Wenn Sie mehrere häufigsten Wörter erhalten möchten, können Sie diese Methode verwenden:

public List<string> GetMostFrequentWords(List<string> list) 
{ 
    var groups = list.GroupBy(x => x).Select(x => new { word = x.Key, Count = x.Count() }).OrderByDescending(x => x.Count); 
    if (!groups.Any()) return new List<string>(); 

    var maxCount = groups.First().Count; 

    return groups.Where(x => x.Count == maxCount).Select(x => x.word).OrderBy(x => x).ToList(); 
} 

[TestMethod] 
public void Test() 
{ 
    var list = @"Dubai,Karachi,Lahore,Madrid,Dubai,Sydney,Sharjah,Lahore,Cairo".Split(',').ToList(); 
    var result = GetMostFrequentWords(list); 

    Assert.AreEqual(2, result.Count); 
    Assert.AreEqual("Dubai", result[0]); 
    Assert.AreEqual("Lahore", result[1]); 
} 
1

Falls Sie Dubai, Lahore wollen nur (d nur Worte mit Top-Vorkommen, die 2 in der Probe vorhanden ist):

List<String> list = new List<String>() { 
    "Dubai", "Karachi", "Lahore", "Madrid", "Dubai", "Sydney", "Sharjah", "Lahore", "Cairo" 
    }; 

    int count = -1; 

    var result = list 
    .GroupBy(s => s, s => 1) 
    .Select(chunk => new { 
     name = chunk.Key, 
     count = chunk.Count() 
    }) 
    .OrderByDescending(item => item.count) 
    .ThenBy(item => item.name) 
    .Where(item => { 
     if (count < 0) { 
     count = item.count; // side effects, alas (we don't know count a-priory) 

     return true; 
     } 
     else 
     return item.count == count; 
    }) 
    .Select(item => item.name); 

Test:

// ans: Dubai, Lahore 
    Console.Write("ans: " + String.Join(", ", result)); 
0

Ich bin sicher, dass es eine bessere Art und Weise sein, aber eine Sache, die ich verwalten zu machen (welche Sie helfen, es zu optimier zu machen) ist wie etwas

List<string> list = new List<string>(); 
     list.Add("Dubai"); 
     list.Add("Sarjah"); 
     list.Add("Dubai"); 
     list.Add("Lahor"); 
     list.Add("Dubai"); 
     list.Add("Sarjah"); 
     list.Add("Sarjah"); 


     int most = list.GroupBy(i => i).OrderByDescending(grp => grp.Count()) 
      .Select(grp => grp.Count()).First(); 
     IEnumerable<string> mostVal = list.GroupBy(i => i).OrderByDescending(grp => grp.Count()) 
      .Where(grp => grp.Count() >= most) 
      .Select(grp => grp.Key) ; 

diesen Willen Liste derer folgen, die am häufigsten auftreten, wenn zwei Einträge auftreten Frequenz gleich ist, beide werden sie aufgenommen werden.

HINWEIS Wir wählen Einträge mit der Häufigkeit nicht mehr als einmal aus.

Verwandte Themen