2016-10-25 3 views
-2

Ich frage mich nur, was ist das beste Wort auf dieser Regel basiert: (verschiedene Buchstaben in einem Wort)^2/(insgesamt Buchstaben im Wort). Also begann ich mit einigen grundlegenden SachenLeaderboard mit verschiedenen Listen

 StreamReader SR = new StreamReader (FILE_PATH); 
     int counter = 0; 
     string line; 

     List<string> words = new List<string>(); 
     List<double> points = new List<double>(); 

     while ((line = SR.ReadLine()) != null) { 
      short unique = (short)line.Distinct().ToArray().Length; 
      short total = (short)line.Length; 
      double value = (15 * Math.PI * Math.Pow (unique, 2))/total; 

      words.Add (line); 
      points.Add (value); 

      counter++; 
     } 

     int Index = points.IndexOf (points.Max()); 
     Console.WriteLine ("best: " + words [Index] + " points: " + points [Index]); 
    } 

Aber ich würde auch gerne eine Bestenliste mit den "besten" Worten und den relativen Punkten haben. Ich habe eine Idee im Kopf, die verschiedene Listen erfordern würde, um das Wort herauszufinden, das die Punkte hat, aber gibt es eine einfachere und schnellere Weise, das zu tun?

Antwort

0

Ich schlage vor, mit einem einzigenDictionary<string, double> (Wort und seine entsprechenden Wert) anstelle von zwei Reißverschluss Lists:

Dictionary<string, double> points = File 
    .ReadLines(FILE_PATH) 
//.Where(line => !string.IsNullOrEmpty(line)) // you may want to filter out empty lines 
    .Select(line => new { 
    word = line, 
    unique = word.Distinct().Count() 
    total = word.Length }) 
    .ToDictionary(item => item.word, 
       item => 15 * Math.PI * item.unique * item.unique/item.total); 

So können Sie leicht ein Leaderboard mit Hilfe implementieren Linq:

Verwandte Themen