2013-12-02 7 views
2

У меня есть следующие функции делегата в Test Unit, и он прекрасно работаетСоздание функции делегата, который принимает параметры

List<Record> RecordSet = FileData.RecordSet; 
Record result = RecordSet.Find(
     delegate(Record r) 
     { 
      return r.UserID == "12345"; 
     } 
    ); 

и он прекрасно работает. Мне нужно выполнить этот поиск несколько раз, поэтому я попытался добавить его в функцию, которую я мог бы вызвать, которая приняла UserID в качестве параметра, она очень похожа, но по какой-то причине ALWAYS возвращает значение null.

public Record findRecord(List<Record> RecordSet, string UserID) 
{ 
    Record result = RecordSet.Find(
     delegate(Record r) 
     { 
      return r.UserID.Trim() == UserID; 
     } 
    ); 

    return null; 
} 

Я также попытался его жесткое кодирование «12345» в качестве значения UserID, который также возвращает нуль. Еще более странно то, что когда я в режиме отладки, и я смотрю на значения в RecordSet, я вижу запись с точным UserID. Тем не менее по какой-то причине никаких результатов, однако один и тот же код и одни и те же данные в первой функции выше возвращает результат просто отлично.

Кроме того, FYI, я увлекаюсь решение LINQ проблемы:

Record result = RecordSet.Where(x => x.UserID == "12345").Select(x => x).First(); 

Но я специально искал причин, почему решение делегат неудачу

+4

Что вы думаете: 'return null;' в конце вашего метода –

+0

вы указали мне точное решение. изменить его на 'Записать результат = RecordSet.Find ( делегат (Запись г) { возврата r.UserID.Trim() == Идентификатор_пользователя; } ); результат возврата; ' работал. Я запутался, потому что предположил, что возвращение внутри делегата возвращает функцию. когда на самом деле он просто возвращался к переменной результата, которая, в свою очередь, возвращала значение null. общий новичок ошибка. Спасибо, @ conrad-frix. – Josh

ответ

5

Проблема заключается в том, что ваш метод всегда возвращает null, из-за этой линии:

return null; 

Заменить его с этим, и вы должны иметь лучшую удачу:

return result; 

Однако, вы можете упростить это с лямбда-выражения, которое принимает Record и возвращает bool. Попробуйте следующее:

return RecordSet.Find(r => r.UserID.Trim() == UserID); 
+0

благодаря тому, что Конрад указал мне на решение выше, но я дал вам ответ, так как вы его записали, благодаря кучу. – Josh

+0

+1. @JulieShannon - функция безоговорочно возвращает 'null'. На самом деле не имеет значения, выполняется ли делегирование или нет. Не знаете, почему вы настаиваете на необходимости делегировать делегат вообще (on может просто удалить строку «Record result = Re ...» и код не изменят ее поведение). –

Смежные вопросы