C#-使用struct或enum查找字符串中的元音

C#-使用struct或enum查找字符串中的元音,c#,struct,C#,Struct,我正在学习使用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.

我正在学习使用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;
        }
公共静态字符串元音()
{
string myString=“计算此字符串中的元音数”;
字符串输出=string.Empty;
for(int i=0;i
首先,我不喜欢我的
if
语句中有这么多的条件,所以我认为使用一些引用类型将是一种更优雅的方式来保留元音,其次,即使有很好的理由选择
if
语句而不是
struct
,也可以,
enum
或任何其他类型,我也想学习使用它们。你能帮我找到用
struct
enum
保存元音的
myString
字符串中每个字符的最佳方法吗

谢谢


Leron

考虑在编程中完成任务,这并不是一种真正有用的方式。。。尤其是这个。在本例中,您正在进行更适合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);
}

不需要枚举或类似的东西。您应该考虑任务中涉及的步骤,然后考虑是否需要存储状态,如果需要存储状态,需要存储什么类型的状态,等等。

struct
s、
enum
s和
class
es都是固定大小(非常简单)的数据结构。也就是说,每一个结构都始终持有相同数量的信息,无论其价值如何。与javascript不同,您不能向C#struct动态添加成员

您正在尝试查找某个集合中的所有字符实例-尽管您碰巧知道该集合的大小,但您已经注意到这不是一个非常通用的解决方案。一般来说,集合的大小不是固定的:因此没有“只使用结构”的解决方案。您在这里看到的抽象级别是错误的

在.NET中,相当于一个javascript对象(您可以只添加成员
a
e
i
o
u
,然后使用该对象检查字母是否作为成员出现)是一个
字典。但是,您知道您的键是单字母的,因此您可以使用
char
而不是
string
,而且您不需要使用这些键保存任何值(您只关心是否有键),因此您可以使用
哈希集

无论如何;通常,您无法轻松地将动态值(如某些输入字母)映射到静态概念(如类型的成员)(至少在没有反射等缓慢、不易处理、易出错的技术的情况下是如此)。尽管枚举值是运行时(动态)变量,但您也无法轻松使用它们,因为(1)如果没有至少像大型if语句一样复杂的内容,您无法真正轻松地将
char
转换为
enum
,以及(2)即使您可以,您通常无法测试枚举是否是某个集合的成员,而无法更好地检查char是否是某个集合的成员

总而言之:枚举没有帮助,
char
->
enum
不是一个“琐碎”的转换,
struct
s成员是静态概念,您无法真正与动态概念(如字母值)进行比较


另一个次要细节:如果输入“另一个次要细节”,您的示例方法将产生不正确的输出…

也许这就是您要寻找的:

Enum.GetNames(typeof(myenum)).Contains(...);
这样使用:

enum myenum { a, e, i, o, u }
 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;
    }
以及:


正如其他人所指出的,我并不是说这是执行这项任务的正确方法。我只是回答似乎是重点的问题——如何获取这些对象的部分列表。

以下是完成任务的几种不同方法

这一点很简单:

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 ;

    }
private static readonly SortedSet set of元音=新的SortedSet(“aeiouAEIOU”);
私有静态字符串提取器元音字母3(字符串s)
{
如果(s==null)抛出新的ArgumentNullException(“s”);
字符串元音=新字符串(s.Where(c=>setofvowells.Contains(c)).ToArray());
返回元音;
}
正如Perl僧侣所说,“Tim Toady”或TMTOWTDI:有多种方法可以做到这一点

可以这样解决“我不喜欢if语句中的这么多条件”:

enum myenum { a, e, i, o, u }
 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 myString=“计算此字符串中的元音数”;
字符串输出=string.Empty;
for(int i=0;i
如果要完全从函数中提取字母,请尝试:

 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;
    }
string元音=“aeiou”;
公共静态字符串元音()
{
string myString=“计算此字符串中的元音数”;
字符串输出=string.Empty;
for(int i=0;i
@DJKRAZE:我不知道