【问题标题】:Contains Unicode Character checking fail包含 Unicode 字符检查失败
【发布时间】:2013-05-26 05:54:08
【问题描述】:
    public bool ContainsUnicodeCharacter(char[] input)
    {
        const int MaxAnsiCode = 255;
        bool temp;
        string s;

        foreach (char a in input)
        {
            s = a.ToString();
            temp = s.Any(c => c > MaxAnsiCode);

            if (temp == false)
            {
                return false;
            }
        }            
    }

此代码用于检查输入字符数组上是否存在 unicode。

我收到错误消息: "包含UnicodeCharacter(char[])':并非所有代码路径都返回值"

这里出了什么问题,请帮忙。 谢谢。

【问题讨论】:

  • 所有 .NET chars 是 Unicode 字符。
  • 嗯,s = a.ToString(); temp = s.Any(c => c > MaxAnsiCode); 可以直接替换为temp = a > MaxAnsiCode;

标签: c# .net .net-4.0


【解决方案1】:

您的方法没有经过深思熟虑。它可以做得更简单:

public static bool ContainsUnicodeCharacter(this IEnumerable<char> input)
{
    const int MaxAnsiCode = 255;
    return input.Any(c => c > MaxAnsiCode);
}

你有两个没有理由的嵌套循环。

我把这个方法做成了一个普遍适用的扩展方法。

【讨论】:

  • 如果您将参数input 设为IEnumerable&lt;char&gt; 类型,则可以使用字符串或char 值的任何集合轻松调用该方法。此外,该签名将向调用者发出信号:“我们不会更改您的input,我们只会循环遍历它。”
  • 这是另一个不使用 lambda 表达式的解决方案stackoverflow.com/a/40252987/348551
【解决方案2】:

您需要在最后一个} 之前添加return true;,但我也认为您的测试颠倒了:

public bool ContainsUnicodeCharacter(char[] input)
{
    const int MaxAnsiCode = 255;
    bool temp;
    string s;

    foreach (char a in input)
    {
        s = a.ToString();
        temp = s.Any(c => c > MaxAnsiCode); // true if unicode found

        if (temp == true)
        {
            return true;
        }
    }

    return false;
}

【讨论】:

    【解决方案3】:

    除了@egrunin 的回答,我不知道为什么要遍历所有字符,然后将它们转换为字符串,这样您就可以在生成的字符数组上使用 Linq 方法。您可以像这样简化整个方法(保持相同的逻辑):

    public bool ContainsUnicodeCharacter(char[] input)
    {
        const int MaxAnsiCode = 255;
    
        return input.Any(c => c > MaxAnsiCode);
    }
    

    【讨论】:

      【解决方案4】:

      您只有 1 个 return 语句,如果条件 if...如前所述,您可以添加 return true;,但您收到该错误的原因是如果 temp 永远不等于 false,您的函数没有任何可返回的内容

      p>
      public bool ContainsUnicodeCharacter(char[] input)
          {
              const int MaxAnsiCode = 255;
              bool temp;
              string s;
      
              foreach (char a in input)
              {
                  s = a.ToString();
                  temp = s.Any(c => c > MaxAnsiCode);
                  if (temp == false)
                  {
                     return false;
                   }
              } 
               return true;  
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 2011-03-31
        相关资源
        最近更新 更多