有办法修正这个语句吗

if(sOnser==(“hello”||“hello”||hi“||”hi“||hey“||“hey”||”Hay“||hey”)){}

它出现了错误

运算符“||”不能应用于“string”和“string“类型的操作数

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

1
  • 也许你也想检查大小写不敏感,所以你好,您好!,你好夏威夷群岛全部匹配。 评论 2013年11月2日13:18

12个答案12

重置为默认值
13

为了避免如此多的比较,你可以这样做

var list=新字符串[]{“hello”,“hello”,”hi“,”hi“,“hey”,“hey”,”Hay“,”hey“};if(列表。包含(答案)){}
1
8

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

sOnser==“你好”返回布尔值。不能将布尔值与字符串进行比较。

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

4
  • @JohnH:这一次我认为这是一个Java问题,并明确地从大写改为小写。。 评论 2013年11月2日13:17
  • 没问题。我通常不会这么挑剔,但对于刚开始使用C#的人来说,这可能并不明显。:)
    – 约翰·H
    评论 2013年11月2日13:17
  • 这并不是一个确切的答案。在他的代码中,他无与伦比回答到字符串“你好”-这也不是错误的原因。 评论 2013年11月2日13:42
  • @user2674389:那是因为他的代码根本不起作用。我的答案反映了他试图完成的任务(如果去掉括号,这实际上是第一次比较),错误也是由他试图使用无效代码引起的。如果你想从字面上描述大多数无效代码的问题,你可以解释很多:关键是找出海报想要做什么,并相应地回答。 评论 2013年11月2日13:47
4

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

发件人||操作员(C#参考)

条件-OR运算符(||)执行其布尔操作数。

所以你不能使用一串具有的值||操作员。两个操作数都应为布尔值值。

您可以将LINQ与可枚举。任何以及类似的;

string[]array=new-string[]{“hello”,“hello”,”hi“,”hi“,“hey”,“hey”,”Hay“,”hey“};if(array.Any(sOnser.Equals)){//您的sOnser等于您的数组值之一。}

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

公共静态bool EqualsAny<T>(此T输入,参数T[]项){退货项目。包含(输入);}

然后你可以这样打电话:

if(回答。等于Any(“hello”、“hello”、”hi“、”hi“、“hey”、“hey”、”Hay“、”hey“)){ ...}
1
if(sOnser==“hello”||sOnser==“hello”|| sOnser==“hi”||s所有者==“hi”|| s所有者===“hey”||S所有者==”hey“||s拥有者==”Hay“|| s拥有者=”hey“){}

或者您可以编写一个单独的函数来进行检查

private bool CheckInput(字符串输入){String[]所有者={“hello”,“hello”,”hi“,”hi“,“hey”,“hey”,”Hay“,”hey“};for(int i=0;i<所有者长度;i++){if(所有者[i].Equals(输入));返回true;}返回false;}
0
1

大多数编程语言都不是这样工作的。你实际上是在要求它计算“你好”等。。||运算符不能应用于字符串(无论如何,您希望结果是什么?)

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

if(someBool==(true||false))某事;

应该这样吗

  1. 始终执行,因为一些Bool总是要么真实的,或
  2. 仅在以下情况下执行一些Bool真实的,因为真||false真实的?

我所知道的每一种编程语言(在这种情况下是适用的)都会选择第二种情况,这可以推广到其他看起来类似的构造(例如您的示例),甚至更广泛地说,孤立地查看任何子表达式都足以确定它的作用。选择第一种方法可以使你在确定任何子表达式的含义之前,必须先查看整个表达式,因为它们的含义可能取决于外部的东西。

1

您还可以:

var sAnswer=“hello”;var answerList=新列表{“HELLO”,“HI”,“HEY”,“HAY”};bool checkAnswer=答案列表。任何(r=>r==sAnswer.ToUpper());

使用林克,您可以将选项设置为大写,以及.ToUpper()(上)答案

1
  • 这对于只包含a-z的字符串来说很好,但许多字符串包含来自其他书写系统的字符,并且它们可能无法通过大写进行规范化。请考虑使用ToUpperInvariant或使用OrdinalIgnoreCase选项进行比较。
    – 利珀特
    评论 2013年11月2日15:35
1

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

if((sOnser==“hello”)||{//在此处插入代码}

与其他建议相比,这可能是最简单的编码方式,但有些人可能认为这不是一个好的实践。无论如何,编码要有趣。

1
  • 这是最容易实现的,因为我必须测试一些简单的东西,比如(foo==“”)||(bar==““”). 评论 2022年3月2日14:28
0

使用。等于()以比较字符串

String sAnswer=“hello”;if(sAnswer.Equals(“hello”)||sAnswer。等于(“Hi”)系统。慰问。写(“是”);其他的系统。慰问。写入(“否”);

如果你不想进行区分大小写的比较,你可以大写你的答案,这样你就不必与同一字符串的多个变量进行比较

String sAnswer1=“hello”;String sAnswer2=“helLLo”;String sAnswer3=“你好”;sAnswer=回答。ToUpper();if(sAnswer1.Equals(“你好”))->真if(sAnswer2.Equals(“HELLO”))->真if(sAnswer3.Equals(“你好”))->真

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

String sAnswer=“watching”;if(答案。包含(“嗨”))

会把你归真(因为watcHIng包含“hi”),我想你不想这样

1
  • 4
    这不是Java,C#调用.等于()将字符串与进行比较时的幕后操作==. 评论 2013年11月2日13:31
0

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

private const string test=“HellohelloHihiHeyhey”;static void Main(字符串[]参数){string UserInput=控制台。ReadLine();if(test.Contains(UserInput)){慰问。WriteLine(“成功!!”);}   }
0

您也可以尝试使用开关。

string sOnser=“hello”;开关(样式类型){case“你好”:case“你好”:case“嗨”:case“嗨”:case“嘿”:case“嘿”://...匹配的逻辑断裂;违约://...逻辑不匹配断裂;}
-1

逻辑或(||):如果C#中的||运算符连接的条件中至少有一个为true,则该运算符的计算结果为true。在这种情况下,如果sAnswer匹配任何指定的字符串(“hello”、“hello”),则整个条件都为true。

正确语法:此语法确保将sAnswer单独与要检查的每个字符串进行比较。如果任何比较结果为true,那么将执行If语句中相应的代码块。

区分大小写:记住,在C#中,默认情况下字符串比较区分大小写。所以“Hello”和“Hello”被认为是不同的字符串。

例子:

公共静态void Main(string[]args){string sAnswer=“嗨”;string[]validAnswers={“hello”,“hello”,”Hi“,”hey“,”hey“,“Hay”,“hey”};if(Array.Exists(validAnswers,answer=>answer=sAnswer)){慰问。WriteLine(“成功”);//如果sAnswer与任何指定字符串匹配,则执行代码}其他的{慰问。WriteLine(“失败”);}}

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.