Я думаю, что вопрос был недостаточно ясен в первом пункте.
Делегаты - это всего лишь указатель на функцию, которую будет сгенерировать компилятор для вас.
Я вижу вашу точку Constant
здесь, потому что у вас есть local
переменных в качестве параметра, Func<Population, bool>
не будет указывать только на нормальный method
он должен также хранить переменное население local
в некотором роде.
Normal Сценарий:
PopulationsList.Any(pop => pop.Name == "constantString")
Является Equivelant к:
PopulationsList.Any(CompilerGeneratedFunction);
private bool CompilerGeneratedFunction(Population pop)
{
return pop.Name == "constantString";
}
комплекс Сценарий:
(Если у вас есть объекты, включенные в ваш лямбда, компилятор должен сохраните этот объект в каком-либо месте, где функция может получить к нему доступ)
input = population;
PopulationsList.Any(CompilerGeneratedFunction);
Population input = null;
private bool CompilerGeneratedFunction(Population pop)
{
return pop => pop.Name == input .Name && pop != input;
}
Вы не можете передать другой параметр в CompilerGeneratedFunction
, поскольку подпись Делегат Func<Population, bool>
, поэтому метод должен принимать population
объект только и вернуть boolean
.
Это не совсем то, что делает компилятор, компилятор может создать класс для хранения объектов, но это всего лишь обходной путь.
OK - Я релиз; в настоящее время Я могу написать метод расширения для списка следующим образом: public static bool containsOther (этот список
ephraim
Извините, я не понимаю вашу проблему. Ваш второй пример хорошо работает: http://ideone.com/cO8jJj В чем проблема? Я не уверен, но, возможно, [это] (http://ideone.com/4BP7JL) - это то, что вы ищете. –
Спасибо, проблема с моим вторым примером была «constantName» не существует. Но действительно, пример, который вы прислали мне, работает, а также освежает с точки зрения дизайна, но делает его сложным ... (обертка для каждого поиска) – ephraim