2016-04-13 18 views
0

Ich habe dieses Problem mit meiner Ausgabe dieses Codes, der ausgibt, wie oft ein Zeichen in einer Zeichenfolge erwähnt wird.Doppelte Ausgabe beim Zählen von Zeichen in einer Zeichenfolge mit Linq

class Program 
{ 
    static void Main(string[] args) 
    { 
     string str = Console.ReadLine().ToLower(); 
     string sortedString = String.Concat(str.OrderBy(c => c)); 

     foreach (char ch in sortedString) 
     { 
      Console.WriteLine($"{ch} => {str.Count(x => x == ch)}"); 
     } 
    } 
} 

Dies ist die Ausgabe erhalte ich:

Alabala 
a => 4 
a => 4 
a => 4 
a => 4 
b => 1 
l => 2 
l => 2 

Dies ist die Ausgabe I

Alabala 
a => 4 
b => 1 
l => 2 

schätzen würde, wenn mir jemand hilft raus wollen.

+0

Es sortiert die str Zeichenfolge in einer alphabetisch sortiert. Wenn die Eingabe also "Alabala" ist, wird es wie folgt sortiert: "aaaabll" – Thenis

Antwort

2

können Sie verwenden Kombination von ToDictionary(), OrderBy() und Distinct() Methoden:

 string str = "halleluyah"; 

     var grouppedChars = str 
      .Distinct()  // removes duplicates 
      .OrderBy(c => c) // orders them alphabetically 
      .ToDictionary( // converts to dictionary [string, int] 
       c => c, 
       c => str.Count(c2 => c2 == c)); 

     foreach (var group in grouppedChars) 
     { 
      Console.WriteLine($"{group.Key} => {group.Value}"); 
     } 

     Console.ReadKey(); 

Ausgang:

a => 2 
e => 1 
h => 2 
l => 3 
u => 1 
y => 1 

P. S. Das ist besser als GroupBy(), weil Sie nicht wirklich wollen, dass diese Zeichen irgendwo gruppiert werden, aber behalten Sie nur, sie zu zählen.

Methode 2, Ihre eigene Struktur mit char Informationen hinzufügen:

 struct CharStatistics 
     { 
      public readonly char @char; 
      public readonly int count; 

      public CharStatistics(char @char, int count) 
      { 
       [email protected] = @char; 
       this.count = count; 
      } 
     } 

In Main-Methode:

 string str = "halleluyah"; 

     var charsInfo = str 
      .OrderBy(c => c) 
      .Distinct() 
      .Select(c => 
       new CharStatistics(c, str.Count(c2 => c2 == c))); 

     foreach (var stats in charsInfo) 
     { 
      Console.WriteLine($"{[email protected]} => {stats.count}"); 
     } 
2

Sie können dies wie unten in einzelnen Linq tun:

string str = Console.ReadLine().ToLower(); 
string sortedString = String.Concat(str.OrderBy(c => c)); 

var result = sortedString.GroupBy(x => x) 
         .Select(y => string.Format("{0} => {1}", y.Key, y.Count())).ToList(); 

foreach (var output in result) 
{ 
    Console.WriteLine(output); 
} 
+0

Sie können den 'sortedString' vereinfachen zu:' var sortedString = str.OrderBy (c => c); '- es ist nicht nötig, ihn wieder einzuschalten ein Faden. Ebenso können Sie die 'ToList()' verlieren. –

+0

ja :). Ich habe gerade den Ergebnisteil aktualisiert. Eher orderBy kann Teil der einzelnen linq sein – Nitin

+1

Wenn du verrückt werden willst, könntest du schreiben: 'var result = str.OrderBy (c => c) .GroupBy (x => x) .Wähle (y => $" {y.Key} => {y.Count()} ");';) –