Проблема с предикатами в C # - PullRequest
3 голосов
/ 12 июля 2011

У меня есть следующее определение метода (ИЗМЕНЕНО для удаления избыточного универсального):

public static T SearchAgaistValues<T>(Dictionary<string, string> input, 
string key, List<T> values, Predicate<T> match, out string[] cmdParams)

Мои упрощенные требования заключаются в следующем.Мне нужно поискать input для key, и, если найден, посмотреть, отображается ли его значение в values.Тем не менее, values является общим (и, очевидно, будет содержать строку, с которой мне нужно соответствовать).Поэтому, как я понимаю, я должен передать метод предиката для выполнения сопоставления.

Однако, каждый пример Predicate<T>, который я видел, имеет жестко закодированный компаратор.Мне нужно сравнить найденное значение key's с каждым элементом в values.Однако я не могу передать эти значения.

Я не вижу, как это сделать вне цикла foreach с помощью метода сопоставления на основе делегата.

Я что-то здесь упускаю?

1 Ответ

5 голосов
/ 12 июля 2011

На мой взгляд, у вас есть два варианта без изменения безумных требований.

Вариант 1 - использовать Func<string, T1, bool> вместо Predicate<T1>. Таким образом, предикат может преобразовывать между строкой и T1 по мере необходимости и возвращать логический совпадающий результат.

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Func<string, T1, bool> match, 
            out string[] cmdParams)

В качестве альтернативы вы можете передать дополнительный параметр Converter<T1, string> для преобразования искомой строки в T1, а затем сравнить с помощью предиката.

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Converter<T1, string> converter,
            Predicate<T1> match, 
            out string[] cmdParams)

Хотя оба случая не идеальны. Эта функция больше похожа на проблему, которая ищет решение, чем наоборот. Подпись немного сумасшедшая и кажется, что ее можно значительно упростить, пересмотрев требования или разбив ее на части.

...