Сравнение выражений в циклах может занять больше времени, чем выбор из словаря.
Как уже указывалось в ветке, существуют способы их сравнения, но очень трудоемкие и не точные:
x => x.Key == 1
против
y => y.Key == 1
против
int value = 1
x => x.Key == value
даст ложь
Так что создание индексов ad hoc не является хорошим решением.
То, что вы могли бы сделать, это иметь класс фабрики индексирования с предопределенными шаблонами выражений, которые создают выражения при первом обращении к некоторой комбинации параметров и используют их (экземпляры) с помощью .Equals по ссылке.
Что-то вроде (псевдоC # ode):
static class Indexfactory {
private static Dictionary<IndexcreationParams,Expression> ...
// more of these as required
public static Expression getIndex<Tret,P1,P2,P3,...>(IndexType type, P1 p1,P2 p2,P3 p3...) {
// create expression from template with the supplied parameters
// if not already existent, else rerturn it from static storage
// store expression in some private storage
}
}
Затем сохраните выражение как ключ в словаре со списком результатов, когда оно будет выполнено первым. При следующих выполнениях проверьте, кэшировали ли вы результаты для этого выражения, поскольку, если вы используете фабрику, вы всегда получите одну и ту же ссылку.