linq表达式不区分大小写

leo*_*ora 12 c# linq comparison expression

我正在利用这个项目来使用jqgrid来过滤和排序集合.缺少一个功能是这个例子不是我需要的不区分大小写的搜索.

因此,如果用户键入"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;
Run Code Online (Sandbox Code Playgroud)

无论如何,下面的这些检查是不区分大小写的,所以"测试"将等于"测试"

Expression.NotEqual    
Expression.Equal
Expression.Call(memberAccessToString,
                    typeof(string).GetMethod("Contains"),
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 18

在进行比较之前,您可以将两个值都转换为小写.这是一个例子Contains:

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;
Run Code Online (Sandbox Code Playgroud)

但请注意,这不会通过土耳其测试.

  • 这个答案比接受的答案要清晰得多. (4认同)

And*_*are 9

不幸的是,BCL没有Contains允许您指定大小写不变性的重载.您必须获取正确的重载IndexOf作为解决方法(检查结果IndexOf是否大于零):

var methodInfo 
    = typeof(string)
        .GetMethod("IndexOf", 
            new[] { typeof(string), typeof(StringComparison) });
Run Code Online (Sandbox Code Playgroud)

MethodInfo接受a string和a StringComparison,这将允许您指定StringComparison.OrdinalIgnoreCase是否愿意.