在“if”语句中使用字符串的“or”运算符。

4
有没有什么办法可以修复这个语句?
if (sAwnser == ("hello" || "Hello" || "hi" || "Hi" || "hey" || "Hey" || "Hay" || "hey"))
{

}

它出现了错误

Operator '||' cannot be applied to operands of type 'string' and 'string'

如果有人能帮忙,将不胜感激。


也许您还想检查大小写不敏感,这样 hiHihIHI 都可以匹配。 - user2674389
10个回答

13
为避免进行太多比较,您可以执行以下操作
var list = new string[] {"hello", "Hello", "hi", "Hi", "hey", "Hey", "Hay", "hey"};

if (list.Contains(answer))
{
}

你忘记在 if 语句中加上 ) 来关闭它了。 - Soner Gönül

8

每次都要明确引用第一个变量。

sAwnser == "hello" 返回布尔值。您不能将布尔值与字符串进行比较。

您可以创建一个集合,并将所有单独的字符串添加到该集合中。然后,您可以使用 .Contains() 方法。


@JohnH:这一次我以为是一个Java问题,所以明确地从大写改成了小写.. - Jeroen Vannevel
没问题。我通常不会这么挑剔,但对于刚开始学习C#的人来说可能不太明显 :) - John H
这不是一个精确的答案。在他的代码中,他没有将 sAnswer 与字符串 "Hello" 进行比较 - 这也不会导致错误。 - user2674389
@user2674389:那是因为他的代码根本不起作用。我的答案反映了他想要实现的内容(如果你去掉括号,它就是第一个比较),错误也是由于他尝试使用非有效代码引起的。如果你要逐字描述大多数无效代码的问题,你可以解释很多东西:关键是找出发帖人想要做什么并相应地回答。 - Jeroen Vannevel

4
首先,我想指出你问题的根源;
||运算符(C#引用)中得知:
条件OR运算符(||)对其布尔类型的操作数执行逻辑或操作。
因此,你不能使用string值与||运算符。两个操作数都应该是boolean类型的值。
你也可以使用LINQ和Enumerable.Any来实现相同的效果;
string[] array = new string[] {"hello", "Hello", "hi", "Hi", "hey", "Hey", "Hay", "hey"};
if (array.Any(sAwnser.Equals))
{
   // Your sAwnser is equal one of your array values.
}

3

一种可能的语法是创建一个扩展方法,如下所示:

public static bool EqualsAny<T>(this T input, params T[] items)
{
    return items.Contains(input);
}

然后你可以这样调用:
if (sAnswer.EqualsAny("hello", "Hello", "hi", "Hi", "hey", "Hey", "Hay", "hey"))
{ 
    ...
}

2
if (sAwnser == "hello" || sAwnser == "Hello" || sAwnser == "hi" || sAwnser == "Hi" || sAwnser == "hey" || sAwnser =="Hey" || sAwnser =="Hay" || sAwnser =="hey"))
{

}

或者您可以编写一个单独的函数来进行检查。
private bool CheckInput(String input)
        {
            String[] sAwnser = {"hello", "Hello", "hi", "Hi", "hey", "Hey", "Hay", "hey"};
            for (int i = 0; i < sAwnser.Length; i++)
            {
                if (sAwnser[i].Equals(input));
                return true;
            }
            return false;
        }

不用谢 :),我很高兴能帮助你。 - Sudhakar Tillapudi

2
实际上,你可以在这里做的是:
if ((sAwnser == "hello") || (sAwnser =="Hello") || (sAwnser =="hi") || (sAwnser =="Hi") || (sAwnser =="hey") || (sAwnser =="Hey") || (sAwnser =="Hay") || (sAwnser =="hey"))
{
 //insert code here
}

相较于其他建议,这可能是编写代码最简单的方法,但有人可能认为这不是一个好的实践。无论如何,愉快地编码吧。


这是最容易实现的,因为我只需要测试像(foo == "") || (bar == "") 这样的简单内容。 - FiddlingAway

2
您也可以这样做:
var sAnswer = "hello";
var answerList = new List<string> { "HELLO", "HI", "HEY", "HAY" };
bool checkAnswer = answerList.Any(r => r == sAnswer.ToUpper()); 

使用 linq,您可以设置选项将文本转换为大写,然后使用 .ToUpper() 函数得到答案。


这对只包含a-z的字符串有效,但许多字符串包含来自其他书写系统的字符,它们可能无法通过转换为大写来规范化。考虑使用ToUpperInvariant或使用OrdinalIgnoreCase选项进行比较。 - Eric Lippert

1
大多数编程语言不是这样工作的。 实际上,您正在要求它计算 "hello" || "Hello" || etc..,并且 || 运算符不能应用于字符串(无论如何,您希望结果是什么?)。
这个表达式出现在比较的右侧是无关紧要的。考虑一下如果不是这种情况会发生什么 - 这意味着什么?
if (someBool == (true || false))
    something;

如果someBool始终为truefalse,则应该始终执行,或者仅在someBooltrue时执行,因为true || falsetrue

< p > 我所知道的每种编程语言(适用于此类问题)都选择第二种方法,并且可以推广到其他看起来相似的结构(例如您的示例),甚至更普遍地说,只需查看任何子表达式即可确定其功能。选择第一种方法使得必须查看整个表达式,才能确定其任何子表达式可能意味着什么,因为它们的含义可能取决于外部因素。


0
使用.Equals()方法来比较字符串。
        String sAnswer = "hello";
        if( sAnswer.Equals("hello")|| sAnswer.Equals("Hi"))
            System.Console.Write("yes");
        else
             System.Console.Write("no");

如果您不想进行区分大小写的比较,可以将您的 sAnswer 转换为大写,这样您就不必与同一字符串的多个变体进行比较。

        String sAnswer1 = "hello";
        String sAnswer2 = "heLLo";
        String sAnswer3 = "HellO";
        sAnswer = sAnswer.ToUpper();
        if( sAnswer1.Equals("HELLO")) -> True
        if( sAnswer2.Equals("HELLO")) -> True
        if( sAnswer3.Equals("HELLO")) -> True

另外,如果您使用contains()方法,请小心:

        String sAnswer = "watching";
        if( sAnswer.Contains("hi"))

将返回 true(因为 watcHIng 包含“hi”),我认为你不想要那个。


4
这不是Java,C#在使用==比较字符串时会在幕后调用.Equals()方法。 - Jeroen Vannevel

0

你也可以声明一个包含所有这些值的常量字符串,每次需要检查时只需调用contains方法:

private const string test = "HellohelloHihiHeyhey";

static void Main(string[] args)
{
    string UserInput = Console.ReadLine();

    if (test.Contains(UserInput))
    {
        Console.WriteLine("success!!");
    }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接