c# - Equals() 方法在比较时无法识别相似/相同的字符

标签 c# comparison equals

为什么用 .Equals 比较字符总是返回 false?

char letter = 'a';
Console.WriteLine(letter.Equals("a")); // false

总的来说,我正在尝试编写一个英语 - 摩尔斯电码翻译器。我在比较上面显示的 char 值时遇到问题。我从 foreach 开始分析来自 ReadLine() 输入的所有字符,通过使用 WriteLine() 方法,所有字符都是转置很好,但是当尝试使用 .Equals() 方法比较它们时,无论我做了什么,在尝试比较字符时它总是输出 false。

我已经成功地对其他字符串使用了 .Equals() 方法,但它似乎不适用于我的字符。

using System;
public class MorseCode {
  public static void Main (string[] args) {
    Console.WriteLine ("Hello, write anything to convert it to morse code!");
    var input = Console.ReadLine();
    foreach (char letter in input) {
      if(letter.Equals("a")) {
        Console.WriteLine("Its A - live");
      }
      Console.WriteLine(letter);
    }
    var morseTranslation = "";
    foreach (char letter in input) {
      if(letter.Equals("a")) {
       morseTranslation += ". _ - ";
      }
      if(letter.Equals("b")) {
       morseTranslation += "_ . . . - ";
      }
      if(letter.Equals("c")) {
       morseTranslation += "_ . _ . - ";
      }
      ...
      }
    }
    Console.WriteLine("In morse code, " + input + " is '"morseTranslation + "'");
  }
}

开始时,我编写了 foreach 来测试它是否识别并运行了正确的输出,但最后,当我将“sample”写入 ReadLine(),它给了我:

Hello, write anything to convert it to morse code!
sample
s
a
m
p
l
e

最佳答案

当你这样做时:

var c = 'x';
var isEqual = c.Equals("x");

结果 (isEqual) 将始终为 false,因为它将 stringchar 进行比较。这将返回 true:

var isEqual = c.Equals('x');

区别在于"x"是一个string字面量而'x'是一个char字面量.

造成这种混淆的部分原因是,当您使用对象的 Equals 方法时,它允许您将任何类型与任何其他类型进行比较。所以你可以这样做:

var x = 0;
var y = "y";
var isEqual = x.Equals(y);

...编译器将允许它,即使 intstring 之间的比较不起作用。它会给你这个警告:

当比较intchar 等值类型与其他相同类型的值时,我们通常使用==,例如

if (someChar == someOtherChar)

那么如果你尝试这样做:

if(someChar == "a") 

它不会编译。它会告诉您,您正在比较一个 char 和一个 string,这样就更容易了,因为不需要运行程序并查找错误,它不会编译并且它会准确地告诉您问题出在哪里。


只是为了好玩,这是另一个实现。

public static class MorseCodeConverter
{
    private static readonly Dictionary<char, string> Codes 
        = CreateMorseCodeDictionary();

    public static string Convert(string input)
    {
        var lowerCase = input.ToLower();
        var result = new StringBuilder();
        foreach (var character in input)
        {
            if (Codes.ContainsKey(character))
                result.Append(Codes[character]);
        }
        return result.ToString();
    }

    static Dictionary<char, string> CreateMorseCodeDictionary()
    {
        var result = new Dictionary<char, string>();
        result.Add('a', ". _ - ");
        result.Add('b', "_ . . . - ");
        // add all the rest
        return result;
    }
}

一个区别是它本身就是一个类,没有控制台应用程序。然后您可以在控制台应用程序中使用它。从键盘读取输入,然后调用

MorseCodeConverter.Convert(input);

获取结果,然后打印到控制台a

将所有字符放入字典意味着无需重复 if/then,您只需检查每个字符是否在字典中即可。

关于c# - Equals() 方法在比较时无法识别相似/相同的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960323/

相关文章:

c# - Windows窗体应用程序中的记录错误

image-processing - 如何比较两种图像缩放算法的 "quality"?

Java HashMap/Hashtable 不检索自己的键

java - 在JDK 1.6中,String的equals操作可以用==代替吗?

c# - 如何在 C# 中建模此 JSON 数据?

c# - 如何使用C#在Sql-Server中插入视频?

c# - 使用 LINQ 过滤字符串

c# - 为什么 List.BinarySearch() 除了 IComparer<T> 之外没有采用 Comparison<T> 的重载?

java - 如何从两个单独的 ArrayList 中删除重复的对象?

c# - 覆盖 GetHashCode() 时使用 Guid().GetHashCode() 有什么缺点