2016-05-31 4 views
0

пытается использовать лямбда-выражения с предопределенным «Func» вместо того, чтобы писать его внутри функции:Func <param,param> с лямбда

var population = ... 
if (!(PopulationsList.Any(pop => pop.Name == population.Name && pop != population))) 

это работает. Но я не хочу лямбды в моем коде (редактировать и продолжить вопросы)

если population.Name был бы постоянным, я бы написал такой предикат:

Func<Population, bool> namePred = x => x.Name == constantName; 

if (!(PopulationsList.Any(namePred)) 

Как, если вообще, могу ли я использовать такой синтаксис в моем случае. Спасибо

+0

OK - Я релиз; в настоящее время Я могу написать метод расширения для списка следующим образом: public static bool containsOther (этот список ephraim

+2

Извините, я не понимаю вашу проблему. Ваш второй пример хорошо работает: http://ideone.com/cO8jJj В чем проблема? Я не уверен, но, возможно, [это] (http://ideone.com/4BP7JL) - это то, что вы ищете. –

+0

Спасибо, проблема с моим вторым примером была «constantName» не существует. Но действительно, пример, который вы прислали мне, работает, а также освежает с точки зрения дизайна, но делает его сложным ... (обертка для каждого поиска) – ephraim

ответ

0

Я думаю, что вопрос был недостаточно ясен в первом пункте.

Делегаты - это всего лишь указатель на функцию, которую будет сгенерировать компилятор для вас.

Я вижу вашу точку 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.

Это не совсем то, что делает компилятор, компилятор может создать класс для хранения объектов, но это всего лишь обходной путь.

+0

Прошу прощения - я думаю, что не сделал себя достаточно ясным. Нет постоянной. Если бы была постоянная жизнь, было бы легко. Я хотел повторить все группы с помощью моей функции, без использования лямбда ... – ephraim

+0

@ephraim И вы хотите проверить его «имя» на что? 'population.Name', где' population' является локальной переменной? Если это так, 'Метод 1' выше, вы можете идти. – user3185569

+0

yap, метод 1 работает. проблема я не хочу использовать лямбда. – ephraim

0

OK - есть. Instaed из itterating функции предиката Еогеасп экземпляр IEnumerable можно настроить в классе населения следующие функции:

public class population 
{public bool isDuplicateKey(Population pop) 
    { 
     return pop.Name == this.Name && pop != this; 
    } 
} 

использование:

if (!(PopulationsList.Any(population.isDuplicateKey))) 

Спасибо за всю помощь

+0

Это очень плохой способ проверить. Вместо этого вы должны реализовать [IEquatable] (https://msdn.microsoft.com/en-us/library/ms131187 (v ​​= vs.110) .aspx). –

+0

Я не проверяю равных ... Я проверяю существование одного и того же имени. Имя - это мой ключ, и я не хочу позволять двум РАЗЛИЧНЫМ экземплярам с этим ИМЯ. Во всяком случае, точка вопроса не была связана с проектами, но для синтаксиса в предварительном условии я не могу использовать лямбда-выражения. – ephraim