Что не так с моим лямбда-выражением? - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь написать простое лямбда-выражение на C #:

int numElements = 3;
string[]firstnames = {"Dave", "Jim", "Rob"};
string[]lastnames = {"Davidson", "Jameson", "Robertson"};

List<Person> people = new List<Person>();

for(int i = 0 ; i < numElements; i++)
{
    people.Add(new Person { FirstName = firstnames[i], LastName = lastnames[i] });                
}

bool test = people.Contains(p => p.FirstName == "Bob");

Мое понимание лямбда-выражений и того, как они работают, все еще немного нечетко, и я размышлял, почему это не сработает ... Я пытаюсь выяснить, есть ли в списке имя ...

Ответы [ 7 ]

7 голосов
/ 21 февраля 2012

Вы ищете:

bool test = people.Any(p => p.FirstName == "Bob");

Или вы смешиваете Роба и Боба?

6 голосов
/ 21 февраля 2012

Проблема здесь не в лямбдах, а в границах цикла for. Заданные вами массивы имеют длину 3, но значение numElements определено как значение 10. Это означает, что вы получите исключение для недопустимого индекса массива на 4-й итерации цикла. Попробуйте следующее

int numElements = 3;

Или, проще, удалите переменную numElements и выполните итерацию по длине массива firstnames

for (int i = 0; i < firstnames.length; i++) {
  ...
}

РЕДАКТИРОВАТЬ

OP указывало, что первоначально опубликованная numElements была опечаткой. Другие возможные источники ошибок в коде

  • Используйте "Rob" вместо "Bob", если вы хотите найти соответствующий элемент
  • Метод Contains в GenericList<T> должен иметь совместимую подпись делегата. Func<T, bool> например
3 голосов
/ 21 февраля 2012
  1. Убедитесь, что вы связываете пространство имен System.Linq, т.е.

    using System.Linq;
    
  2. Вы используете метод Contains. Этот метод ожидает Person и будет использовать сравнение на равенство, чтобы определить, содержит ли оно уже ваша коллекция. В случае по умолчанию для сравнения равенства по умолчанию используется сравнение ссылок, поэтому оно никогда не будет его содержать, но это уже другая тема.

  3. Чтобы достичь своей цели, используйте метод Any. Это скажет вам, если ЛЮБОЙ из элементов в вашей коллекции соответствует условию.

    people.Any(p => p.FirstName == "BoB");
    

Возможно, вы захотите прочитать о методах расширения First и FirstOrDefault и где они также решат вашу проблему.

2 голосов
/ 21 февраля 2012

Вы не устанавливаете numElements на правильное значение (вы устанавливаете его на 10, но ваши массивы имеют только 3 значения) - более того, вам это даже не нужно, просто используйте инициализатор коллекции вместо отдельной строки массивы:

GenericList<Person> people = new GenericList<Person>()
{
    new Person { FirstName = "Dave", LastName = "Davidson" },
    new Person { FirstName = "Jim", LastName = "Jameson" }
    new Person { FirstName = "Rob", LastName = "Robertson" }
}

Теперь, если ваш класс GenericList<T> реализует IEnumerable<T>, вы можете использовать Any() для проведения теста:

bool test = people.Any(p => p.FirstName == "Bob");
0 голосов
/ 21 февраля 2012
// We will use these things:
Predicate<Person> yourPredicate = p => p.FirstName == "Bob";
Func<Person, bool> yourPredicateFunction = p => p.FirstName == "Bob";
Person specificPerson = people[0];

// Checking existence of someone:
bool test = people.Contains(specificPerson);
bool anyBobExistsHere = people.Exists(yourPredicate);

// Accessing to a person/people:
IEnumerable<Person> allBobs = people.Where(yourPredicateFunction);
Person firstBob = people.Find(yourPredicate);
Person lastBob = people.FindLast(yourPredicate);

// Finding index of a person
int indexOfFirstBob = people.FindIndex(yourPredicate);
int indexOfLastBob = people.FindLastIndex(yourPredicate);

Вы должны поиграть с методами LINQ ...

0 голосов
/ 21 февраля 2012

Пара проблем здесь.

One: GenericList не является типом. Вы, вероятно, искали универсальный тип System.Collections.Generic.List<T>.

Two: Contains принимает Person в вашем примере, а не делегат (лямбда-выражения - это новый способ написания делегатов в C # 3). Один из способов получить то, что вы хотите, это объединить Where и Count в виде bool test = people.Where(p => p.FirstName == "Bob").Count() > 0;

0 голосов
/ 21 февраля 2012

в чем ваша настоящая проблема с этими лямбдами?

Если из-за того, что у вас есть тест false, то это правда, что у вас нет имени "Bob" в firstName

bool test = people.Contains(p => p.FirstName == "Bob");

и

string[]firstnames = {"Dave", "Jim", "Rob"};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...