4

我正在尝试使用 c#(问题 22)解决欧拉项目问题之一。虽然我遇到了问题。可能值得注意的是,我对编程比较陌生,尤其是 c#。

我需要为我拥有的一组字符串想出一个单词分数。这涉及对 aa 单词中每个字母的得分求和,例如 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];
    }
}
4

4 回答 4

2

您可以利用标准ASCII 表的布局来做到这一点。

在 ASCII 中,'a' 字符的十进制值为 97。然后小写字母一直持续到 122。

因此,您可以使用以下方法轻松地将 'a' char 值转换为所需的值:

char charToConvert = 'a';
int requiredValue = (int)charToConvert - 96;
于 2012-04-22T21:47:46.863 回答
1

不要为每个字母分配 26 个变量,而是创建一个IDictionary<TKey, TValue>whereTKey是字符,而 theTValue是您分配的任何值。然后,您可以更轻松地通过传入字符来访问该值。

于 2012-04-22T21:34:51.643 回答
1

如果要计算名称中字母的总和,还可以使用 Linq(只是一个示例):

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

您可以使用字母执行计算,就像在 C# 中使用整数一样。Select 方法(它是 Linq 的扩展方法)将字符串的每个字母投影到其对应的值。然后通过扩展方法 Sum() 对这些值求和。

编辑:正如 jlafay 指出的那样,您可以省略 Select 调用并将投影放入 Sum 方法中:

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

关于您最初的问题:即使使用反射,您也无法访问局部变量的名称。该信息不包含在编译代码的元数据中。

于 2012-04-22T21:35:02.563 回答
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);
            }
        }
    }
}
于 2012-04-22T22:53:08.610 回答