2012-04-22 133 views
4

我想解決一個使用c#的歐拉項目問題(problem 22)。雖然我遇到了問題。可能值得注意的是我對編程相對來說比較陌生,尤其是c#。使用char值與c#中的變量名進行比較?

我需要爲我擁有的字符串集合提供一個單詞評分。這包括總結一個單詞中每個字母的分數,例如, a = 1,b = 2,c = 3等等。爲此,我已將所有26個字母作爲變量與相關分數相關聯。然後我想比較單詞中的每個字母與相同名稱的相關變量。然而,我留下的是char數據類型,我最好的方式是將字符與相關變量進行比較,然後在整數計算中使用變量值。我已經包含了我在下面的代碼,在最後兩行中出現了問題,不包括大括號。 (我有一個快速的看,它似乎不支持在c + +,雖然我不知道c#)。任何幫助將不勝感激。

string[] lines = File.ReadAllLines(@"C:\Users\john\Downloads\names.txt"); 
//Console.WriteLine(lines[1]); 

char[] delimiterChars = { ',', '\t' }; 

string text = lines[0]; 

string[] names = text.Split(delimiterChars); 
Console.WriteLine("{0} words in text:", names.Length); 
Array.Sort(names); 

int a = 1; 
int b = 2; 
int c = 3; 
int d = 4; 
int e = 5; 
int f = 6; 
int g = 7; 
int h = 8; 
int i = 9; 
int j = 10; 
int k = 11; 
int l = 12; 
int m = 13; 
int n = 14; 
int o = 15; 
int p = 16; 
int q = 17; 
int r = 18; 
int s = 19; 
int t = 20; 
int u = 21; 
int v = 22; 
int w = 23; 
int x = 24; 
int y = 25; 
int z = 26; 

int[] nameTotal; 

for (int count = 0; count < names.Length; count++) 
{ 
    string name = names[count]; 
    int total = 0; 
    for (int count2 = 0; count2 < name.Length; count2++) 
    {    
     nameTotal[count] = name.Substring(count2) + total; 
     total = total + nameTotal[count]; 
    } 
} 
+2

'INT letterIndex = CH - 'A';'C#數從0 – 2012-04-22 21:36:23

+0

包括這裏的背景是一個好主意,因爲你的直接問題是誤導。 – CodesInChaos 2012-04-22 21:48:55

+1

看到這行'for(int count2 = 0; count2> name.Length; count2 ++)'。 '>'或'<? – 2012-04-22 21:49:56

回答

1

而是每個字母分配26個的變量,創建一個IDictionary<TKey, TValue>其中TKey是字符和TValue是您指定的任何值。然後,您可以通過更容易地傳遞角色來訪問該值。

+2

即使反射也不允許你按名稱訪問局部變量。 – CodesInChaos 2012-04-22 21:49:33

+0

@CodeInChaos:嗯,我想你是對的。我猜'LocalVariableInfo'不存儲本地變量名稱。有趣... – 2012-04-22 22:01:50

1

如果要計算一個名字的字母的總和,你也可以使用LINQ(只是一個例子):

string name = "ABCD"; 
int sum = name.Select(letter => letter - 'A' + 1).Sum(); 

你可以像在C#中的整數字母進行計算。 Select方法(它是來自Linq的擴展方法)將字符串的每個字母都投影到相應的值。這些值然後由擴展方法Sum()相加。

編輯:jlafay指出的那樣,你可以省略選擇看漲和看跌投影到數總和法:

name.Sum(letter => letter - 'A' + 1) 

以及關於你原來的問題:不能訪問本地變量的名稱,即使有反思。該信息未包含在已編譯代碼的元數據中。

+3

順便說一下,Select()調用是完全沒有必要的。您可以使用與Select()中相同的lambda單獨調用Sum()來做同樣的事情。 – jlafay 2012-04-22 21:38:52

+0

感謝提示:) – Botz3000 2012-04-22 21:43:05

2

您可以通過利用標準ASCII table的佈局來實現此目的。

在ASCII中,「一」字有97小寫字母的十進制值,則繼續向上,直到122

因此,您可以很容易地通過一個「A」字符值轉換成您需要的值使用:

char charToConvert = 'a'; 
int requiredValue = (int)charToConvert - 96; 
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace SO 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      WebClient wc = new WebClient(); 
      var text = wc.DownloadString("http://projecteuler.net/project/names.txt"); 

      var names = Regex.Matches(text, "[A-Z]+").Cast<Match>() 
       .Select(x => x.Value) 
       .OrderBy(x => x) 
       .Select((name, inx) => new 
       { 
        Name = name, 
        Score = name.Sum(c => c - 'A' + 1) * (inx + 1) 
       }); 

      foreach (var n in names) 
      { 
       Console.WriteLine("{0}: {1}", n.Name, n.Score); 
      } 
     } 
    } 
} 
+0

我不知道爲什麼這個投票,這個答案是正確的解決方案 - 它只使用一個LINQ線!令人驚歎的 – neeKo 2012-04-23 00:04:19

+0

@downvoter我想你認爲這是一項功課。我的假設是不是。謹慎評論? – 2012-04-23 00:04:29

+0

只是爲了澄清,這不是作業,我只是爲了我自己的享受 – speeder1987 2012-04-23 10:01:03