2012-04-22 10 views
4

私はc#(problem 22)を使ってオイラープロジェクトの問題の1つを解決しようとしています。私は問題に遭遇しましたが。おそらく私はプログラミング、特にC#には比較的新しいです。char値を使用してC#の変数名と比較しますか?

私には、私が持っている一連の文字列の単語スコアが必要です。これは、単語内の各文字のスコアを合計することを含む。 a = 1、b = 2、c = 3などである。これを行うために、アルファベットの26文字すべてを、関連するスコアの変数として割り当てました。次に、単語の各文字を同じ名前の関連変数と比較したいと思います。しかし、私が残しているのはcharデータ型です。文字を関連する変数と比較し、整数計算で変数の値を使用するのに最適な方法は何ですか?私はこれまでのところ、中括弧を除く最後の2行に問題が発生しているので、これまでのコードを含めました。 (私はすばやく見ましたが、これはC++ではサポートされていないようですが、C#についてはわかりません)。どんな助けでも大歓迎です。代わりに、各文字のための26個の変数を割り当てる

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';あなたの直接の質問は見当違いであるので、文脈を含む0 –

+0

から' C#のカウントここでは、良いアイデアでした。 – CodesInChaos

+1

'(int count2 = 0; count2> name.Length; count2 ++)'の行を参照してください。 '>'または '<'? –

答えて

1

TKeyは、文字とTValueは、割り当てるどのような値であるIDictionary<TKey, TValue>を作成すること。その後、文字をより簡単に渡すことで値にアクセスできます。

+2

反射でさえ、ローカル変数に名前でアクセスすることはできません。 – CodesInChaos

+0

@CodeInChaos:うーん、あなたが正しいと思います。 'LocalVariableInfo'はローカル変数名を格納していないと思います。面白い... –

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

Btw、Select()呼び出しは完全には不要です。あなたはSelect()にあったのと同じラムダでSum()を呼び出すだけで同じことができます。 – jlafay

+0

ヒントありがとう:) – Botz3000

2

標準ASCII tableのレイアウトを利用してこれを行うことができます。 ASCIIで

、「」文字が、その後そのため、あなたは簡単にして、必要な値に「」char値に変換することができます122

まで継続97.小文字文字の10進値を持ちます使用:

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の行は1つだけです!驚いたことに – neeKo

+0

@downvoterあなたはそれが宿題だと思います。私の前提はそうではないということです。コメントする気に? –

+0

私は自分の楽しみのためにこれをやっています。 – speeder1987

関連する問題