运营商'> ='不能应用于' string'类型的操作数和'字符串'

时间:2015-02-18 11:33:15

标签: c# entity-framework-6

我在C#中使用Entity Framework,我的代码是

var result = ef.services.Where(entry => entry.tarikhservice >= textBoxX1.Text
                                     && entry.tarikhservice <= textBoxX2.Text).ToList();

这给了我这个错误:

  

运算符'&gt; ='无法应用于'string'和'string'类型的操作数

如何比较两个字符串并修复错误?

3 个答案:

答案 0 :(得分:17)

当您比较数字时,比如1和2,很明显哪一个更大。但是,当你比较字符串时,哪一个被认为更大:&#34; 2&#34;或&#34; 11&#34;? &#34;富&#34;或&#34; f&#34;?答:这取决于背景。例如,如果按字典顺序对它们进行排序,则会得到&#34; 2&#34;和&#34; f&#34;。如果你想要自然排序,你会得到&#34; 2&#34;之前&#34; 11&#34;。

我认为由于这个原因,相对运算符(&gt;,&gt; =,&lt;,&lt; =)不会因字符串而过载(恕我直言,这是一个很好的决定)。

您的选择是编写自定义逻辑来比较字符串,或使用框架提供的词典比较。代码将是(如果我得到正确的数字):

var result = ef.services.Where(entry => 
        string.Compare(entry.tarikhservice, textBoxX1.Text) >= 0
     && string.Compare(entry.tarikhservice, textBoxX2.Text) <= 0
   .ToList()

要使代码在不受文化影响的情况下运行(您应该!),请将StringComparison作为string.compare的最后一个参数提供:

string.Compare(entry.tarikhservice, textBoxX1.Text, StringComparison.InvariantCulture)

答案 1 :(得分:1)

我不确定我是否同意当前答案中未在String中实施比较运算符的理由。实际上,我认为使用String.Compare实现它们与使用String.Equals的当前等式运算符实现一样。

我有不同的理论。如果您检查Best Practices for Using Strings in .NET,您会注意到以下建议:

  

String类允许您通过调用。来测试相等性   static或实例Equals方法重载,或使用静态   平等运算符。过载和操作员使用序数比较   默认情况下。但是,我们仍然建议你调用一个重载   显式指定StringComparison类型,即使您想要   执行序数比较

请注意,即使他们愿意,他们也无法强制执行此建议 - 即使他们未覆盖==中的String运算符,您仍然可以执行str1 == str2。哎呀,如果你真的想要(obj i = 1),可以使用相等运算符将整数与字符串进行比较。这是因为==在没有专门为操作数类型重写时转换为引用相等。

BCL设计人员意识到这一点并决定他们最好不要实现一个按照预期大多数运行的比较运算符,而不是将比较委托给引用相等,这将是一个非常糟糕的考虑string interningUnicode equivalence的想法。

现在,回到比较运营商。同样存在字符串相同性的缺陷,但BCL设计人员在此更容易理解。通过简单地不实现这些运算符,编译器为它们完成了它们的工作,正如我们在这个问题中所看到的,它阻止开发人员甚至尝试执行str1 >= str2之类的操作。

答案 2 :(得分:0)

你服用是非常合理的。 两个字符串可以相等或不相等。没有别的了。当你比较数字时,或者比较你已经重载了这些运算符的对象时,运算符越大越有意义。

正如here所述,

  

字符串不是数字,因此您需要按字典顺序进行比较。   String.CompareTo用于订购。