2015-06-26 3 views
2

Я хочу, чтобы игнорировать регистр, используя этот запрос LAMBDA:C# Lambda игнорировать регистр

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" 
       }, 
      }; 
     } 
    } 

Если я ищу «ДАР» это вернет два, но «Дар» возвращает 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()' case конверсии, я думаю, что это менее читаемо. – 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, который является IL Weaving инструмент, созданный для .net и использовать Caseless аддон.

При использовании этой библиотеки вы можете написать код, как это (в соответствии с документацией):

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)); 

вернет все экземпляры «ДАР» НЕИЗБИРАТЕЛЬНОГО дела.

Смежные вопросы