C# linq表达式是否可以不区分大小写
我在利用。缺少的一个特性是,这个示例没有执行我需要的不区分大小写的搜索 因此,如果用户键入“Test”,我希望它与“Test”、“Test”等匹配 我有如下代码:C# linq表达式是否可以不区分大小写,c#,linq,comparison,expression,C#,Linq,Comparison,Expression,我在利用。缺少的一个特性是,这个示例没有执行我需要的不区分大小写的搜索 因此,如果用户键入“Test”,我希望它与“Test”、“Test”等匹配 我有如下代码: case WhereOperation.Equal: condition = Expression.Equal(memberAccessToString, filter); lambda = Expression.Lambda(condition,
case WhereOperation.Equal:
condition = Expression.Equal(memberAccessToString, filter);
lambda = Expression.Lambda(condition, parameter);
break;
case WhereOperation.NotEqual:
condition = Expression.NotEqual(memberAccessToString, filter);
lambda = Expression.Lambda(condition, parameter);
break;
case WhereOperation.Contains:
condition = Expression.Call(memberAccessToString,
typeof(string).GetMethod("Contains"),
Expression.Constant(value));
lambda = Expression.Lambda(condition, parameter);
break;
下面的检查是否不区分大小写,这样“Test”就等于“Test”
不幸的是,BCL没有允许您指定大小写不变性的
Contains
重载。您必须获取正确的IndexOf
重载作为解决方法(检查IndexOf
的结果是否大于零):
此
MethodInfo
接受string
和StringComparison
,这将允许您指定StringComparison.OrdinalIgnoreCase
。您可以在进行比较之前将这两个值转换为小写。以下是包含的示例:
case WhereOperation.Contains:
var toLower = Expression.Call(memberAccessToString,
typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
condition = Expression.Call(toLower,
typeof(string).GetMethod("Contains"),
Expression.Constant(value.ToString().ToLower()));
lambda = Expression.Lambda(condition, parameter);
break;
但是,请注意,这一点。您可以通过以下方式获得:
第一个扩展字符串类:
internal static class StringExtensions
{
public static bool ContainsExt(this String str, string val)
{
return str.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) > -1 ? true : false;
}
}
现在将表达式调用编写为
Expression.Call(null,
typeof(StringExtensions).GetMethod("ContainsExt", new Type[] { typeof(String), typeof(String) }),
new[] { memberAccessToString, Expression.Constant(value));
问题是(即使有可能),为什么你们需要那个?似乎有一个设计问题-你能详细说明吗?@BrokenGlass-我正在使用此代码通过一些用户输入过滤集合。这里没有设计问题。用户可能会键入我当时误解的“test”或“test”,谢谢你澄清,对筛选字符串和筛选值调用ToLower
(可能通过使用Expression.Call)是一个选项吗?你不能总是将用户输入格式化为小写,然后进行比较吗?@Andrew Hare-你能澄清你的答案吗。我被你的回复弄糊涂了。下面的代码如何进行不区分大小写的搜索???@ooo:我刚刚写了一个答案,但由于Andrew已经涵盖了最重要的部分,下面是剩下的部分:var callEx=Expression.Call(memberAccessToString,method,Expression.Constant(value),Expression.Constant(StringComparison.OrdinalingOreCase));条件=表达式.NotEqual(callEx,表达式.Constant(-1));@Ani-你从哪里得到“方法”?@ooo:这是Andrew回答中的methodInfo
。@ooo-抱歉,不会。这段代码只提供了methodInfo
你需要做一个大小写不变的“包含”自己实现。
internal static class StringExtensions
{
public static bool ContainsExt(this String str, string val)
{
return str.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) > -1 ? true : false;
}
}
Expression.Call(null,
typeof(StringExtensions).GetMethod("ContainsExt", new Type[] { typeof(String), typeof(String) }),
new[] { memberAccessToString, Expression.Constant(value));
case WhereOperation.Contains:
var callEx = Expression.Call(memberAccess, typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) }), Expression.Constant(value), Expression.Constant(StringComparison.OrdinalIgnoreCase));
condition = Expression.NotEqual(callEx, Expression.Constant(-1));
lambda = Expression.Lambda(condition, parameter);
break;