4

有没有办法解决这个问题

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

}

它出现了错误

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

如果有人可以提供帮助,将不胜感激

4

10 回答 10

13

为了避免这么多比较,你可以做

var list = new string[] {"hello", "Hello", "hi", "Hi", "hey", "Hey", "Hay", "hey"};

if (list.Contains(answer))
{
}
于 2013-11-02T13:16:30.627 回答
8

您必须每次都显式引用第一个变量。

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

您可以做的是创建一个集合并将所有单独的字符串添加到其中。之后你就可以在上面使用.Contains()了。

于 2013-11-02T13:13:55.930 回答
4

首先,我想指出您问题的根源;

|| Operator (C# Reference)

条件或运算符 (||) 对其布尔 操作数执行逻辑或。

因此,您不能将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.
}
于 2013-11-02T13:16:27.573 回答
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"))
{ 
    ...
}
于 2013-11-02T13:28:49.730 回答
2

你也可以这样做:

var sAnswer = "hello";
var answerList = new List<string> { "HELLO", "HI", "HEY", "HAY" };
bool checkAnswer = answerList.Any(r => r == sAnswer.ToUpper()); 

使用linq,你可以将选项设置为大写,然后.ToUpper()答案

于 2013-11-02T13:36:48.743 回答
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;
        }
于 2013-11-02T13:14:35.937 回答
1

大多数编程语言都不是这样工作的。您实际上是在要求它进行计算"hello" || "Hello" || etc..,并且||运算符不能应用于字符串(无论如何,您希望结果是什么?)

表达式显示为比较的右侧是无关紧要的。还要考虑如果不是这种情况会发生什么——这意味着什么?

if (someBool == (true || false))
    something;

那应该

  1. 总是执行,因为someBool总是要么trueor false, or
  2. 仅当someBoolis时执行true,因为true || falseis true?

我所知道的每种编程语言(适用于其中)都选择第二种情况,并且可以将其推广到看起来相似的其他构造(例如您的示例),甚至更普遍地说,孤立地查看任何子表达式就足够了来确定它的作用。选择第一种方式使得您必须先查看整个表达式,然后才能确定它的任何子表达式可能意味着什么,因为它们的含义可能取决于它们外部的某些东西。

于 2013-11-02T13:23:43.647 回答
1

实际上你可以在这里做的是:

if ((sAwnser == "hello") || (sAwnser =="Hello") || (sAwnser =="hi") || (sAwnser =="Hi") || (sAwnser =="hey") || (sAwnser =="Hey") || (sAwnser =="Hay") || (sAwnser =="hey"))
{
 //insert code here
}

与其他建议相比,这可能是最简单的编码方式,但有些人可能认为这不是一个好习惯。无论如何,玩得开心编码。

于 2013-11-02T14:18:20.133 回答
0

您还可以使用所有这些值声明一个 const 字符串,并且每次需要检查时只需调用 contains 方法:

private const string test = "HellohelloHihiHeyhey";

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

    if (test.Contains(UserInput))
    {
        Console.WriteLine("success!!");
    }   
}
于 2013-11-02T14:42:36.143 回答
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"))

会让你返回真实的(因为 watchHIng 包含“hi”),我不认为你想要那个

于 2013-11-02T13:30:29.940 回答