values
是一个object
数组。我需要检查第3和第4个元素是否为字符串。如果是这种情况,我需要检查它们是否相等。
我是这样做的:
if ( values[2] is string &&
values[3] is string &&
((values[2] as string) == (values[3] as string)))
{
return false;
}
有更简单或更短的方法吗?
答案 0 :(得分:2)
这是我将如何做到的:
return values[2] is string && values[2].Equals(values[3]);
知道两个对象中的一个是字符串就足够了。如果它等于另一个对象,则可以保证另一个对象也是一个字符串。
另外,请注意使用Equals()
代替==
来保证字符串内容的比较而不是对象引用。
答案 1 :(得分:2)
我认为string.Equals(object)
方法在这里最简单。
result = string.Equals(value[2], value[3]);
来自MSDN
如果obj是一个String并且其值与此实例相同,则返回true;否则,错误。如果obj为null,则该方法返回false。
答案 2 :(得分:1)
您只需检查其中一个是否为字符串,因为您要检查它们是否相等。如果它们相等而且一个是字符串,则两者都是。
return (values[2] is string) && (values[2] == values[3]);
答案 3 :(得分:1)
if
语句检查对象是否与给定类型兼容。对于
例如,以下代码可以确定对象是否是实例
MyObject类型,或从MyObject派生的类型:
if (obj is MyObject)
{}
如果是这种情况,请使用更清晰的代码(c#编译器将负责效率)
使用:
Object.Equals(a, b)
它检查字符串内容的相等性,而不是 引用(因为字符串是不可变的,实际上不可能有两个 引用相同内存的字符串对象,如果我错了,请更正。 它将“引擎盖”称为String.Equals,因为Equals是虚拟的。
这是一种非常模糊的方式来比较字符串,我承认,更糟糕,更清晰,价格相同。
答案 4 :(得分:0)
答案 5 :(得分:0)
添加到之前的答案
return value[2] != null && value[2] is string && value[2].Equals(value[3]);
来自eric lipperts帖子:http://blog.coverity.com/2014/01/13/inconsistent-equality/#.Vfp63d-qqko
在场景三中,我们必须首先解决重载决策问题,以确定Equals的含义。接收器的类型为int,它有三个名为Equals的方法:
Equals(object, object) // static method from object
Equals(object) // virtual method from object
Equals(int) // Implements IEquatable<int>.Equals(int)
我们可以消除的第一个因为没有足够的参数。在另外两个中,唯一最好的方法是采用int;将short参数转换为int而不是object更好。因此我们调用Equals(int),然后使用值相等性再次比较两个整数,所以这是真的。
来自MSDN
IEquatable.Equals方法(T) 指示当前对象是否等于同一类型的另一个对象。