2015-04-15 2 views
4

У меня есть следующий код, который расширяет функциональность моего фильтра, чтобы я мог искать более одного Zip-кода. Ex. (1254,125,145,1455)Фильтр с *, который будет сдерживать все значения, начинающиеся с Null?

Текущий код:

if (Post_Code_PAR != null) 
{ 
    String[] PostCode_Array = Post_Code_PAR.Split(','); 
    query = from p in query where PostCode_Array.Contains(p.Post_Code) select p; 
} 

Я хочу продлить этот код таким образом, что если я дам ему что-то вроде (0 *) будет найти почтовые индексы, которые начинаются с 0 Если я дам ему 123 *, он даст мне все почтовые индексы, начинающиеся с 123. Большое спасибо.

+0

Вы также должны иметь возможность делать такие мелодии, как '* 123' для вещей, заканчивающихся' 123' или '1 * 1' для вещей, которые заканчиваются и начинаются с' 1 '? –

+0

@ Hjalmar: это было бы хорошо, я тоже могу это сделать. – Dragon

ответ

2
string Post_Code_PAR = ""; 
String[] PostCode_Array = Post_Code_PAR.Split(','); 
var zipCodeList = query.Where(x => CustomFilter(x.Post_Code, PostCode_Array)).ToList(); 

private static bool CustomFilter(string code, string[] foundZipCodes) 
{ 
    return foundZipCodes.Any(x => 
    { 
     x = x.Trim(); 
     var text = x.Replace("*", ""); 
     if (x.EndsWith("*")) 
      return code.StartsWith(text); 
     if (x.StartsWith("*")) 
      return code.EndsWith(text); 
     if (x.Contains("*")) 
      return false; 
     return code.StartsWith(text); 
    }); 

} 

Теперь пользователь может найти: "0 *, * 52" и т.д.

+0

Привет Бондарюк: как насчет этой строки? Query = from p в запросе, где PostCode_Array.Contains (p.Post_Code) выбирает p; " Должен ли я удалить его? – Dragon

+0

@ Zayed да, вы можете. если вы хотите только startwith использовать var zipCodeList = PostCode_Array.Where (x => x.StartsWith (startWith)); –

+0

Привет, я не получаю, что вы делаете этот фильтр var = "* 0";?. У меня есть параметр «Post_Code_PAR», который пользователь вводит в него значения vales. Я хотел отфильтровать эти дольки, если он написал что-то вроде 1455 * -> это даст мне все значения, которые начинаются с 1455 – Dragon

3

использование регулярных выражений:

пример:

IEnumerable<string> allInputs = new[] {"70000", "89000", "89001", "90001"}; 
string commaSeparatedPostCodePatterns = @"89000 , 90\d\d\d"; 

if (string.IsNullOrWhiteSpace(commaSeparatedPostCodePatterns)) 
    return; 

string[] postCodePatterns = commaSeparatedPostCodePatterns 
           .Split(',') 
           .Select(p => p.Trim()) // remove white spaces 
           .ToArray(); 

var allMatches = 
    allInputs.Where(input => postCodePatterns.Any(pattern => Regex.IsMatch(input, pattern))); 

foreach (var match in allMatches) 
    Console.WriteLine(match); 

С такой проблемой первоначальные требования очень просты, но быстро становятся все более сложными (из-за интернационализации, исключения из правила, некоторые умные тестеры тестируют неожиданный лимит-лимит, такой как 90§$% ...). Таким образом, регулярные выражения обеспечивают наилучшую компромиссные простоты против расширяемости

Регулярного выражения эквивалентно * является .*. Но в вашем случае вам скорее понадобятся более строгие шаблоны и используйте заполнитель \d, соответствующий одной цифре. Дополнительная цифра будет \d?. Ноль или более цифр будет \d*. Одна или несколько цифр будут \d+. Более подробную информацию смотрите в документации.

+0

Я просто использовал 'Console.WriteLine()', чтобы проверить, что он работает в образце программы: он записывает в консоль dos результат. Вы можете игнорировать последние две строки. Замечание: предпочитайте синтаксис linq 'myList.Where (...)' вместо 'from myItem в myList ...': В большинстве случаев это более читаемо. – jeromerg

+0

см. Дополнение к ответу – jeromerg

+0

Если вы хотите сохранить один символ '*' в своих шаблонах почтового кода, вы можете установить его на лету в начале с помощью 'myString.Replace (" * ",". * ") '. Таким образом, вы сохраняете силу регулярных выражений для будущих расширений и продолжаете избегать утверждения 'if'. – jeromerg

3

Вы можете заменить * на \d*, который является способом регулярного выражения «любое количество цифр», в основном. Затем пройдите и отфильтруйте с помощью Regex.IsMatch().

if (Post_Code_PAR != null) 
{ 
    var PostCode_Array = from p in Post_Code_PAR.Split(',') select String.Format("^{0}$", p.Replace("*", @"\d*")); 
    query = (from p in query where PostCode_Array.Any(pattern => Regex.IsMatch(p.Post_Code, pattern)) select p).ToArray(); 
} 

Я попытался сохранить его как можно ближе к вашему коду, но вы можете немного его очистить и использовать лямбда вместо этого. Но это должно сработать так же хорошо :)

+0

Добавить' using System.Text.RegularExpressions; 'наверху документа. –

+0

Где это говорят? –

+0

FYI: полевой почтовый индекс в моем наборе данных - это строка, а параметр тоже - строка – Dragon

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