【问题标题】:Convert character to its alphabet integer position?将字符转换为其字母整数位置?
【发布时间】:2013-12-01 10:08:51
【问题描述】:

我正在尝试查找是否有一种快速方法可以获取字母表中字符的整数位置 (C#)。

我可以简单地创建一个数组并获得位置,但似乎必须有一种“漂亮而时髦”的方式来实现这一点?

我还研究了将(大写)字符的 ASCII 位置与“65”相关的位置...但同样,这似乎比应有的工作要多!

[仅限英文 26 个字母,不需要国际化 - 不,这不是家庭作业!]

【问题讨论】:

    标签: c# alphabetical


    【解决方案1】:

    编程 101:

    char c = 'A';
    //char c = 'b'; you may use lower case character.
    int index = char.ToUpper(c) - 64;//index == 1
    

    【讨论】:

    • int index = ((int) char.ToUpper(c)) - 64;
    • 所以把它包括在答案中:)
    • 不需要演员表。只需执行int index = char.ToUpper(c) - 'A'; 另外,A 不应该位于索引 0 处吗? C# 使用从 0 开始的索引!
    • @MatthewWatson - 如果它是一个数组,我同意 0,但在这种特殊情况下,我确实希望 A 成为“字母表的第 1 个字符”。
    • 另一个变种:int index = (int)c % 32;.
    【解决方案2】:

    小写和大写:

    int index = (int)c % 32;
    

    【讨论】:

    • 我不得不尝试一下,因为我不相信它会起作用..但它确实有效,这非常好!
    • 'a' 是 0x41,'A' 是 0x61。 0x20 = 32。而 26
    • 这很聪明,@Vladimir。
    • @Vladimir 反之亦然如何?从索引中获取字符?
    • @Luiy return (char) ( 'a' + (position - 1) 怎么样?
    【解决方案3】:

    由于 charint 可以在计算中混合和匹配,您可以将 char 视为一个数字(这肯定介于众所周知的值之间):

    char c = 'A';
    var index = (c < 97 ? c - 64 : c - 96);
    

    【讨论】:

      【解决方案4】:

      @Ahmed 方法的清晰、可读、基于 0 的实现,带有边界检查。

      /// <summary>
      /// Converts a latin character to the corresponding letter's index in the standard Latin alphabet
      /// </summary>
      /// <param name="value">An upper- or lower-case Latin character</param>
      /// <returns>The 0-based index of the letter in the Latin alphabet</returns>
      private static int GetIndexInAlphabet(char value)
      {
          // Uses the uppercase character unicode code point. 'A' = U+0042 = 65, 'Z' = U+005A = 90
          char upper = char.ToUpper(value);
          if (upper < 'A' || upper > 'Z')
          {
              throw new ArgumentOutOfRangeException("value", "This method only accepts standard Latin characters.");
          }
      
          return (int)upper - (int)'A';
      }
      

      【讨论】:

      • 转换为基于 1 的返回值是微不足道的,留给读者。 ;)
      【解决方案5】:

      这是一个很好的实现,用于从 Excel 字符串中读取列到列号。感谢@ahmed-kraiem 和@vladimir 提供上述答案。

         public int AddColFromLetter(string s)
          {
              int column = 0;
              int iter = 1;
              foreach (char c in s)
              {
                  int index = char.ToUpper(c) - 64;//Ahmed KRAIEM
                  //int index = (int)c % 32;//Valdimir
                  if(iter == 1)
                      column += index;
                  if(iter > 1)
                      column += 25+ index;
                  iter++;
              }
              return column;
          }
      

      【讨论】:

      • 正是我想要的!像魅力一样工作。
      【解决方案6】:

      受弗拉基米尔回答的启发,另一种方法是

      int index= c & 0b11111;
      

      解释:'A' 在 ascii 中是 65,在二进制中是 01000001。 'a' 是 95,即二进制 01100001。如果我们简单地丢弃 3 个最高有效字节,我们将获得字母整数位置,这就是位掩码的作用。

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 2015-01-03
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多