2012-04-22 82 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

相关问题