2015-06-26 55 views
2

我想用这个LAMBDA查询忽略大小写:C#拉姆达忽略大小写

public IEnumerable<StationDto> StationSearch(string search) 
     { 
      var data = GenerateDtos(); 

      var list = data.Where(x => x.StationName.Contains(search)); 




      //var searchDto = new SearchDto { 



      return null; 
     } 



     private static IEnumerable<StationDto> GenerateDtos() 
     { 
      return new List<StationDto>() 
      { 
       new StationDto() 
       { 
        StationId = 1, 
        StationName = "DARTFORD" 
       }, 
       new StationDto() 
       { 
        StationId = 2, 
        StationName = "DARTMOUTH" 
       }, 
       new StationDto() 
       { 
        StationId = 3, 
        StationName = "TOWER HILL" 
       }, 
       new StationDto() 
       { 
        StationId = 4, 
        StationName = "DERBY" 
       }, 
       new StationDto() 
       { 
        StationId = 5, 
        StationName = "lIVERPOOL" 
       }, 
       new StationDto() 
       { 
        StationId = 6, 
        StationName = "LIVERPOOL LIME STREET" 
       }, 
       new StationDto() 
       { 
        StationId = 7, 
        StationName = "PADDINGTON" 
       }, 
       new StationDto() 
       { 
        StationId = 8, 
        StationName = "EUSTON" 
       }, 
       new StationDto() 
       { 
        StationId = 9, 
        StationName = "VICTORIA" 
       }, 
      }; 
     } 
    } 

如果我搜索“DAR”将带回两个,而是“DAR”带回0项。 我该如何修改这个查询?

+0

看来所有的名字都是大写的。为什么你需要使用'dar'而不是'DAR'? – RogueCSDev

+1

@RogueCSDev它主要是为了鲁棒性。我知道我可以用上或下来绕过它,但我想知道是否有更好的方法。 –

+0

如果其中一个电台被命名为“FOODAR”,该怎么办?你会期望你的DAR(或DAR)搜索能找到那个吗? – kdbanman

回答

4

假设你正在谈论x.StationName.Contains(search)你可以做

var list = data 
    .Where(x => x.StationName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) 

你也可以添加一个String扩展方法

public static class StringExtensions 
{ 
    public static bool Contains(this string thisObj, string value, StringComparer compareType) 
    { 
     return thisObj.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0; 
    } 
} 

,并使用它像这样

var list = data 
    .Where(x => x.StationName.Contains(search, StringComparison.OrdinalIgnoreCase)); 
+0

这给我带回了一切。 –

+0

@nickgowdy:那么它意味着一切都与搜索条件相匹配:) –

+0

虽然这比'ToLower()'或'ToUpper()'大小写转换更有效,但我认为它的可读性较差。 – kdbanman

3

喜欢的东西这将工作:

var list = data.Where(x => x.StationName.ToLower().Contains(search.ToLower())); 

或者

var list = data.Where(x => x.StationName.Contains(search, StringComparer.OrdinalIgnoreCase); 

不知道语法是第二正确。我觉得是这样的。

+0

这两个(尤其是第一个)远比* IndexOf(...)> = 0更具可读性。好答案。 – kdbanman

1

使用类似如下:

var list = data.Where(x => x.StationName.ToUpper().Contains(search.ToUpper())); 
1

你可以利用Fody这是.NET创建和使用Caseless附加一个IL Weaving工具。

当使用这个库,你可以写这样的代码(按照文档):

public bool Foo() 
{ 
    var x = "a"; 
    var y = "A"; 
    return x == y; 
} 

,但会被编译为:

public bool Foo() 
{ 
    var x = "a"; 
    var y = "A"; 
    return string.Equals(x, y, StringComparison.OrdinalIgnoreCase); 
} 

,这样你就不必记住设置ignorecase或ToUpper/ToLower。我不知道你的情况,但我想不出一个什么时候我真的想要区分大小写的字符串比较......这可以应用到整个项目中,所以你永远不必记得再做一次! :)

在你的具体例子,现有的代码,你正在使用的:

var list = data.Where(x => x.StationName.Contains(search)); 

将带回的“DAR”案的滥所有实例。