FindAll в списке пользовательских объектов - PullRequest
0 голосов
/ 18 сентября 2009

Ну, у меня есть объект под названием Mamamia, и внутри него есть некоторые строковые свойства. Я создал список этого объекта и заполнил его 150 элементами.

Я пытаюсь использовать List.FindAll, но на самом деле я не знаю, как это сделать. Я пробовал так:

produto = products.FindAll(delegate(Mamamia cv) {return cv.LocalPackage.Remove(1,21) == cmbPackage.SelectedValue};

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

Заранее спасибо!

1 Ответ

1 голос
/ 18 сентября 2009

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

Какие типы задействованы и что вы ищете? О, а вы используете C # 3 и / или .NET 3.5? Это упростит задачу (даже C # 3 против .NET 2.0 означает, что вы можете использовать лямбда-выражение вместо анонимного метода).

Что происходит, когда вы запускаете код в данный момент? Если он просто ничего не находит, это может просто потому, что вы проверяете равенство ссылок (если SelectedValue возвращает object).

Попробуйте это:

produto = products.FindAll(delegate(Mamamia cv) {
    return cv.LocalPackage.Remove(1,21).Equals(cmbPackage.SelectedValue);
});

EDIT:

Звучит так, будто вам нужно только одно значение, и если вы используете .NET 3.5, было бы более идиоматично использовать LINQ в первую очередь. Я бы использовал:

string selectedText = (string) cmbPackage.SelectedValue;
Mamamia item = products.FirstOrDefault
                  (cv => cv.LocalPackage.Remove(1,21) == selectedText);
if (item != null)
{
    // Found it; otherwise item will be null
}
...