C# linq表达式是否可以不区分大小写

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,

我在利用。缺少的一个特性是,这个示例没有执行我需要的不区分大小写的搜索

因此,如果用户键入“Test”,我希望它与“Test”、“Test”等匹配

我有如下代码:

            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;