【问题标题】:using a char value to compare to a variable name in c#?使用 char 值与 c# 中的变量名进行比较?
【发布时间】:2012-05-03 13:48:13
【问题描述】:

我正在尝试使用 c# (problem 22) 解决 Euler Project 问题之一。虽然我遇到了问题。可能值得注意的是,我对编程比较陌生,尤其是 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];
    }
}

【问题讨论】:

  • int letterIndex = ch - 'A'; C# 从 0 开始计数。
  • 在此处包含上下文是个好主意,因为您的直接问题被误导了。
  • 见此行for (int count2 = 0; count2 &gt; name.Length; count2++)。 &gt; 或 &lt; ?
  • 是的,你是对的,应该是
  • 也感谢所有快速响应,我没想到会得到如此完整和全面的答案。当我下班磨练时,我会尝试。感谢所有帮助:)

标签: c# .net char


【解决方案1】:
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);
            }
        }
    }
}

【讨论】:

  • 我不知道为什么这被否决了,这个答案是问题的正确解决方案 - 它只使用一条 LINQ 行!太棒了
  • @downvoter 我猜你认为这是一个家庭作业。我的假设是它不是。想发表评论吗?
  • 澄清一下,这不是作业,我只是为了自己的乐趣而做这些
  • 顺便说一句,这似乎不起作用....至少用它给我的解决方案,我无法解决问题 22 :/ COLIN 的价值是应该的。想法,L.B.?
  • 好吧,通过一些调试,我发现 LINQ 使用特定于文化的排序,而且我的语言恰好有连字符 - 所以 ANJA 紧随 ANNE,因为 'nj' 被计为一个字符。这给出了一个稍微不同的顺序,这反过来导致了一个不正确的答案......找到之后,我所要做的就是Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);....希望它可以帮助某人
【解决方案2】:

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

【讨论】:

  • 即使反射也不允许您通过名称访问局部变量。
  • @CodeInChaos:嗯,我想你是对的。我猜LocalVariableInfo 不存储局部变量名称。有趣...
【解决方案3】:

如果你想计算一个名字中字母的总和,你也可以使用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)

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

【讨论】:

  • 顺便说一句,Select() 调用是完全没有必要的。您可以使用与 Select() 中相同的 lambda 单独调用 Sum() 来做同样的事情。
【解决方案4】:

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

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

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

char charToConvert = 'a';
int requiredValue = (int)charToConvert - 96;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 2021-12-28
    • 2012-05-19
    • 2013-12-21
    • 1970-01-01
    • 2014-05-17
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多