【发布时间】:2020-02-06 07:48:43
【问题描述】:
我有一个 DataGridView,我正在编写一些通用代码来添加过滤器。列的基础数据类型可以是任何类型,但是如果它们是字符串,我希望过滤器使用不区分大小写的比较。
我还使用Equals 方法而不是== 运算符来确保它不仅仅是进行参考比较。字符串Equals 方法有一个重载,可以让您选择StringComparison 类型,但我不知道它是否会成为字符串,所以我只能访问Equals 可用于@987654326 的方法@。
我尝试为object 编写一个Equals 扩展方法,它可以让我指定一个StringComparison 类型。这个想法是,如果对象是字符串,那么它将在字符串对象上调用适当的Equals 重载,否则它只会使用普通的Equals 方法。但是,这似乎不起作用,因为我收到一个编译错误,指出我无法将该方法作为实例方法访问,并且必须指定一个类型。我已经在下面包含了扩展方法,以防我在其中做错了什么......我确实仓促地写了它,但我认为这不是问题;我想我只需要找到另一种方法来做到这一点。
public static class Extensions
{
public static bool Equals(this object obj1, object obj2, StringComparison comparisonType)
{
if (obj1 == null && obj2 == null)
return true;
if (obj1 == null && obj2 != null)
return false;
if (obj1 != null && obj2 == null)
return false;
string s = obj1 as string;
if (s != null)
{
var s2 = obj2 as string;
return s2 != null && s.Equals(s2, comparisonType);
}
else
return obj1.Equals(obj2);
}
}
所以我正在寻找更好的方法,或者如果我只是在上面的代码中犯了错误,请告诉我。
编辑:
下面是消费代码的样子。 _filters 只是一个包含一些属性的对象列表,如下所示,item 是IEnumerable<T>。
foreach (var f in _filters)
{
items = items.Where(o => o[f.FieldName].Equals(f.Value, StringComparison.InvariantCultureIgnoreCase));
}
【问题讨论】:
-
是的,扩展方法编译得很好。我刚刚添加的 EDIT 中的代码无法编译。
-
使用其他扩展方法,如
IsEqual,在方法内部检查参数是否为字符串,以您喜欢的方式进行比较。 -
@RezaAghaei 做到了。因为自己没有想到它而感到愚蠢。谢谢!
-
如果这种方法是多余的,大多数情况下
-
@MichaelRandall 当然,但是我用这种方式写的时间更少,它很简单,而且它的性能与你为任何我将使用它的目的编写的完美一样。 :D
标签: c# .net string object comparison