Этого нельзя сделать с помощью словаря, поскольку он использует хеш-значения, чтобы быстро определить, где искать конкретный ключ.
Как вы обнаружили, вы можете вызывать предикаты напрямую, но это потребует вызова O (n) функций, что не лучше, чем использование List, или даже большого оператора if / then / else.
Если ваша коллекция потенциальных предикатов слишком длинная, чтобы это можно было использовать, вам необходимо создать собственную структуру данных, соответствующую вашим целям. Если вы планируете определять значения только на основе целочисленных диапазонов, это не должно быть сложным, но оно может выйти из-под контроля, если ваши предикаты станут более сложными.
Кстати, язык F #, который имеет встроенную поддержку для такого определения, используя Выражения совпадения . Я не знаю, как обстоят дела с компиляцией веток, но я предполагаю, что это довольно умно.
Редактировать
Вот пример использования выражения соответствия в F # для чего-то вроде этого:
// Define the "choose" function
let choose value =
match value with
| v when v < 10 -> 1
| v when v > 90 -> 2
| _ -> 0
// Test the "choose" function
let choice1 = choose 5
let choice2 = choose 15
let choice3 = choose 95
Приведенный выше код дает следующие значения:
choice1 = 1
choice2 = 0
choice3 = 2
Я никогда раньше не работал с F #, поэтому вам придется поискать, как использовать функцию из F # в программе на C #.