0

私はC#でメインタイプを使用することを学んでいます。この目的のために、文字列内の母音を見つけるための簡単なアルゴリズムを作成しました。ここにあります:

 public static string Vowels()
        {
            string myString = "Count the number of the vowels in this string";
            string output = string.Empty;
            for (int i = 0; i < myString.Length; i++)
            {
                if (myString[i] == 'a' || myString[i] == 'e' ||
                    myString[i] == 'i' || myString[i] == 'o' ||
                    myString[i] == 'u')
                {
                    output += myString[i].ToString().ToUpper(); //Vowel
                }

            }
            return output;
        }

まず、ステートメントの条件があまり好きではないので、if指示対象タイプを使用すると、母音を保持するためのよりエレガントな方法になると思います。次に、ifステートメントを選択する正当な理由がある場合でも、代わりにstructenumまたは私がそれらを使用することを学びたい他のタイプ。または(あなたがより良いと思う)をmyString使用して文字列内の各文字を検索するための最良の方法を教えていただけますか?structenum

ありがとう

レロン

4

5 に答える 5

7

これは、プログラミングのタスクを完了することを考えるのに本当に役立つ方法ではありません...特にこれは。この場合、LINQにはるかに適したデータ処理を行っています。たとえば、メソッドは次のように実装できます。

public static string ExtractVowels(string text)
{
    // Note that this won't find upper-case vowels...
    var vowelArray = text.Where(c => "aeiou".Contains(c))
                         .ToArray();
    // Upper-case it if you want, of course.
    return new string(vowelArray);
}

列挙型などは必要ありません。タスクに含まれるステップについて考えてから、状態を保存する必要があるかどうか、必要な場合はどのような状態にする必要があるかなどを検討する必要があります。

于 2012-08-08T22:18:15.740 に答える
1

structs、enums、およびclassesはすべて、固定サイズの(そして非常に単純な)データ構造です。つまり、各構造体は、その値に関係なく、常に同じ量の情報を保持します。javascriptとは異なり、C#構造体にメンバーを動的に追加することはできません。

あなたはあるセットのキャラクターのすべてのインスタンスを見つけようとしています-そしてあなたはそのセットのサイズを知っていても、それがあまり一般的な解決策ではないことに気づきました。一般に、セットは固定サイズではありません。したがって、「構造体を使用する」という解決策はありません。ここでは、間違ったレベルの抽象化を見ています。

.NETのjavascriptオブジェクト(メンバーa e i o uを追加し、そのオブジェクトを使用して文字がメンバーとして出現するかどうかを確認できます)に相当するものはDictionary<string, object>です。ただし、キーは1文字であるため、charではなく使用できstringます。さらに、これらのキーで値を保存する必要がないため(キーの有無のみを考慮)、を使用できます HashSet<char>

とにかく; 一般に、入力文字などの動的な値を、型のメンバーなどの静的な概念に簡単にマッピングすることはできません(少なくとも、リフレクションなどの遅くて手に負えない、エラーが発生しやすい手法がないわけではありません)。また、列挙値は実行時(動的)変数ですが、(1)少なくとも大きなifステートメントと同じくらい複雑なものがないと、簡単にうまく変換できないため、(char2 )enum通常、列挙型が特定のセットのメンバーであるかどうかをテストすることはできませんが、charが特定のセットのメンバーであるかどうかを確認することはできません。

要約すると、列挙型は役に立たず、char->enumは「些細な」変換ではなく、structsメンバーは静的な概念であり、文字の値などの動的な概念と実際に比較することはできません。

別のマイナーな詳細:入力「別のマイナーな詳細」を指定すると、サンプルメソッドは誤った出力を生成します。

于 2012-08-08T22:23:31.507 に答える
1

多分これはあなたが探しているものです:

Enum.GetNames(typeof(myenum)).Contains(...);

このように使用します:

enum myenum { a, e, i, o, u }

と:

for (int i = 0; i < mystring.Length; i++)
    if (Enum.GetNames(typeof(myenum)).Contains(mystring.Substring(i, 1)))
        Text = "True";

struct(または、さらに言えば)のフィールドを見つけるには、class次のようなものを使用します。

System.Reflection.FieldInfo[] fi = typeof(mystruct).GetFields();
Text = fi[0].Name;

他の人が指摘しているように、これがこのタスクを実行する正しい方法であるとは言っていません。私は、主なポイントと思われるもの、つまりこれらのオブジェクトの一部のリストを取得する方法に答えているだけです。

于 2012-08-08T22:41:56.327 に答える
1

「ifステートメントの条件がそれほど多くない」は、次のように解決できます。

 public static string Vowels()
    {
        string myString = "Count the number of the vowels in this string";
        string output = string.Empty;
        for (int i = 0; i < myString.Length; i++)
        {
            switch(myString[i])
            {
               case 'a':
               case 'e':
               case 'i':
               case 'o':
               case 'u':
                  output += myString[i].ToString().ToUpper(); //Vowel
                  break;
            }

        }
        return output;
    }

関数から文字を完全に抽出したい場合は、次のことを試してください。

 string Vowels = "aeiou";
 public static string Vowels()
    {
        string myString = "Count the number of the vowels in this string";
        string output = string.Empty;
        for (int i = 0; i < myString.Length; i++)
        {
            if(Vowels.Contains(myString[i]))
            {
                  output += myString[i].ToString().ToUpper(); //Vowel
                  break;
            }

        }
        return output;
    }
于 2012-08-24T11:50:26.353 に答える
0

タスクを実行するためのいくつかの異なる方法があります。

これは簡単です:

private static readonly char[] vowel = "aeiouAEIOU".ToArray() ;
public static string ExtractVowels_1( string s )
{
  if ( s == null ) throw new ArgumentNullException("s");

  StringBuilder sb = new StringBuilder( s.Length ) ;

  for ( int i = s.IndexOfAny(vowel) ;  i >= 0 ; i = s.IndexOfAny(vowel , i+1 ) )
  {
    sb.Append(s[i]) ;
  }

  return sb.ToString() ;
}

これはさらに簡単です。

private static readonly Regex rxVowels = new Regex( "[^aeiou]+" , RegexOptions.IgnoreCase ) ;
public static string ExtractVowels_2( string s )
{
  string vowels  = rxVowels.Replace( s , "" ) ;
  return vowels ;
}

次の場合は、すべてのLinqyを「流暢」に入手できます。

    private static readonly SortedSet<char> setOfVowels = new SortedSet<char>( "aeiouAEIOU" ) ;
    private static string ExtractVowels_3( string s )
    {
        if ( s == null ) throw new ArgumentNullException("s");

        string vowels = new string( s.Where( c => setOfVowels.Contains(c) ).ToArray() ) ;
        return vowels ;

    }

Perl Monksが言うように、「Tim Toady」またはTMTOWTDI:それを行うには複数の方法があります。

http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it

于 2012-08-09T00:23:47.497 に答える