2011-06-12 12 views
6

私はC#にDelphiアプリケーションを移植しています。ユニットの1つでは、次のような宣言があります。ポートパスカルconst IdentChars = ['a' .. 'z'、 'A' .. 'Z'、 '_'];宣言からC#

const 
    IdentChars = ['a'..'z', 'A'..'Z', '_']; 

C#の宣言構文が見つかりませんでした。

これは私が思い付くことが最高です:

char[] identFirstChars; // = ['a'..'z', 'A'..'Z', '_']; 
int size = (int)'z' - (int)'a' + 1 + (int)'Z' - (int)'A' + 1 + 1; 
identFirstChars = new char[size]; 
int index = 0; 
for(char ch = 'a'; ch <= 'z'; ch = (char)((int)(ch) + 1)) 
{ 
    identFirstChars[index] = ch; 
    index++; 
} 
for (char ch = 'A'; ch <= 'Z'; ch = (char)((int)(ch) + 1)) 
{ 
    identFirstChars[index] = ch; 
    index++; 
} 
identFirstChars[index] = '_'; 

、より効率的な方法があるに違いありません。

+0

あなたがそれを使用する方法を教えてください。 'char []'だけではありません。 'HashSet 'は別です。 –

+0

ここでコンテキストが.netコンテキスト(isvalididentifier)で有効でなければならない場合、おそらくあなたはこの関数を移植するべきではないでしょう。あなたのために書かれた別の同様の関数.NETフレームワークで既に... http://msdn.microsoft.com/en-us/library/system.codedom.compiler.codedomprovider.isvalididentifier.aspxのようなもの –

答えて

5

これはどうですか?もちろん

char[] identFirstChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_".ToCharArray(); 

、あなたはあなたのコードで配列を生成することができます(これはおそらくEnumerable.Rangeを使用してはるかに少ないラインで行うことができます)が、私はあなたの場合には、それはそれだけの価値はないと思います。

+0

C#識別子にAZ、az、および0-9の場合、これは完全な識別子文字セットではありません。 .Netは幅広い設定を可能にします:http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx –

1
char[] ar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".ToArray(); 
+2

Take(53)に関する少しの説明でより良い答えになるでしょう –

+0

@Henk、それはキャッチ(22)のように違います。 – Johan

+0

文字列が既に 'IEnumerable 'であるため、Take(53)の必要はありません。したがって、LINQのToArray()メソッドが機能します。 –

1

は、最も効率的な方法が、少なくとも、あなたは誤って文字を見逃すことはありません。

var chars = 
    Enumerable.Range('a', 'z' - 'a') 
    .Concat(Enumerable.Range('A', 'Z' - 'A')) 
    .Select(arg => (char)arg) 
    .Concat(new[] { '_' }) 
    .ToArray(); 
+1

それは賢いし、いくつかのクールなものを示していますが、移植されたコードの残りがこのように見えないことを願っています。私の目は痛いです! –

6

IdentCharsは、C#では直接の等価性を持っていないセット、(実際には痛みのビットです)。第二に、IdentCharsはUnicode文字ではなく、Ansi文字のセットなので、そこには注意してください。したがって、 "移植"の前にどのように使用されているかを見ておくことをお勧めします。なぜなら、必要な機能はDeplhiコンパイラに組み込まれており、C#でこれをコーディングする必要があるからです。

1

次のtry、

public static char[] GetConstants() 
     { 
      var array = Enumerable.Range((int) 'a', 26).ToList(); 
      array.AddRange(Enumerable.Range((int) 'A', 26)); 
      array.Add('_'); 
      return array.Select(z => (char) z).ToArray(); 

     } 
0

char[] identFirstChars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".ToCharArray()はそれを行うには1つの迅速かつ汚い方法です;)

関連する問題