对一组单词进行排序和求和会得到错误的结果

时间:2015-02-08 11:19:55

标签: c# arrays sorting cultureinfo

我在使用Project Euler的Problem 22

时遇到了麻烦
  

使用names.txt(右键单击和“保存链接/目标为...”),一个包含超过五千个名字的46K文本文件,首先按字母顺序排序。然后计算每个名称的字母值,将该值乘以列表中的字母位置以获得名称分数。

     

例如,当列表按字母顺序排序时,值为3 + 15 + 12 + 9 + 14 = 53的COLIN是列表中的第938个名称。因此,COLIN将获得938×53 = 49714的分数。   文件中所有名称分数的总和是多少?

到目前为止,这是我自己无法解决的第一个欧拉问题,我不知道我在这里做错了什么。用这个解决方案,我将在1532年前完成。

这是我的代码:

using (WebClient client = new WebClient())
{
    try
    {
        tempString = client
            .DownloadString("http://projecteuler.net/project/resources/p022_names.txt")
            .Replace("\"", "");
    }
    catch (Exception)
    {
        MessageBox.Show("Error, check your internet connection!");
    }
}

string[] names = tempString.Split(',');
Array.Sort(names);
int total = 0;
for (int i = 0; i < names.Length; i++)
{
    int namescore = 0;
    foreach (char c in names[i]) { namescore += (int)c - 64; }

    total += namescore * (i + 1);
}

return total.ToString();

我认为它可能是C#特定的错误或怪癖?

2 个答案:

答案 0 :(得分:1)

如您所述,您无法设置CurrentCulture,因此请设置DefaultThreadCurrentCulture

当我使用

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("hr-HR");

在采取任何行动之前,我得到了相同的结果。所以,显然,你应该使用

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("en-US");

实现预期的输出(除了评论中提到的它在ToString()方法中不足以执行此操作,因为它也会影响排序)。

答案 1 :(得分:0)

好的,让我们一步一步地检查,找出不一致的地方。我有正确的答案。

初始数据:

names.Length == 5163
names.Count(w=>!Regex.IsMatch(w,"^[A-Z]+$")) == 0
names.Sum(w=>w.Length) == 30959

部分总和(在N元素之后):

500: 7139561
2500: 187773540
5000: 811204450

更新:

我有一个想法:Sort是特定于语言环境的!试试Sort(StringComparison.Ordinal)

UPDATE2:

要将文化,set thread culture or AppDomain culture切换为CultureInfo("en-US")