Лучший способ вызвать либо StartsWith / EndsWith условно - PullRequest
1 голос
/ 16 января 2012

У меня есть метод, подобный следующему:

StringComparison comparison = StringComparison.CurrentCultureIgnoreCase;

switch(SearchType)
{
case SearchType.Contains:
list = list.Where(a => a.Reference.Contains("test",comparison));
break;

case SearchType.StartsWith:
list = list.Where(a => a.Reference.StartsWith("test",comparison));
break;

case SearchType.EndsWith:
list = list.Where(a => a.Reference.EndsWith("test",comparison));
break;
}

Как вы, вероятно, можете догадаться, SearchType - это мое собственное перечисление.

Есть ли более простой способ сделать это, возможно?используя отражение?Несколько переключателей кажутся немного уродливыми.

Ответы [ 3 ]

1 голос
/ 16 января 2012

Какая часть этого нелегка?

Полагаю, вы могли бы вместо этого иметь класс для каждого перечисления, наследовать от общего интерфейса SearchType и реализовать функцию с именем ProcessList - не уверен, какой список предлагает лучшую функцию.

Что-то вроде ..

interface SearchType
{
   object ProcessList(object list, string text);
}

class Contains : SearchType
{
   object ProcessList(object list, string text)
   {
      list = list.Where(a => a.Reference.Contains(text, StringComparison.CurrentCultureIgnoreCase));
   }
}

Нужно сделать класс для каждого типа перечисления.

Тогда вам нужно установить переменную SearchType следующим образом ...

SearchType searchType = new Contains();//or something else

и ваш коммутатор может быть заменен этим ...

list = searchType.ProcessList(list, "test");

... Не совсем проще с точки зрения кодирования, но вместо переключателя вы получите более читаемый код.

0 голосов
/ 16 января 2012

Это должно работать:

StringComparison comparison = StringComparison.CurrentCultureIgnoreCase;

var methods = new Dictionnary<SearchType, Func<string, string, bool>>();

methods.Add(SearchType.Contains, (str, pattern) => str.Contains(pattern, comparison));
methods.Add(SearchType.StartsWith, (str, pattern) => str.StartsWith(pattern, comparison));
methods.Add(SearchType.EndsWith, (str, pattern) => str.EndsWith(pattern, comparison));

var contains = methods[SearchType.Contains](list, "test");
var startswith = methods[SearchType.StartsWith](list, "test");
var endswith = methods[SearchType.EndsWith](list, "test");

Тем не менее, вы действительно думаете, что он более читабелен, чем стандартный оператор switch?

0 голосов
/ 16 января 2012

Вы можете предоставить делегата вашей функции:

Test(Func<string, StringComparison, bool> tester)
{
    return tester("test", comparison);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...