Как искать объект в Списке <object>, имеющий значение его поля - PullRequest
3 голосов
/ 24 ноября 2011

Вопрос в том, как получить объект из списка, имеющий значение поля

У меня есть список с именем f_objects, заполненный объектами.

private List<F_object> f_objects;

У меня также есть строка с некоторым значением:

string name = "something";

F_object получил метод, возвращающий его поле с именем name:

public string GetName()
{
    return this.name;
}

Есть ли встроенный метод для сравнения объектов в списке со значением этого поля? Или я должен сделать цикл и сравнить так:

foreach(F_object ob in f_objects)
{
    if String.Equals(name, ob.GetName())
    F_object found = ob;
} 

Ответы [ 7 ]

8 голосов
/ 24 ноября 2011

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

List<F_object> found = f_objects.Where(obj => obj.GetName() == name).ToList();

Это список всех подходящих объектов.

Редактировать: В ответе Руны ФС также есть хороший совет по использованию .Single() или .First() вместо .Where(), если вы ожидаете или хотите получить только одно значение.

7 голосов
/ 24 ноября 2011

Есть несколько способов сделать это в linq. Первый - использовать .Where. Это будет соответствовать вашим потребностям, если может быть больше совпадений

IEnumerable<F_object> result = f_objects.Where(obj=>obj.GetName() == name);

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

f_object result = f_objects.First(obj=>obj.GetName() == name);

или если ноль попаданий является принятой ситуацией (не исключение)

f_object result = f_objects.FirstOrDefault(Obj=>obj.GetName() == name);

если вам нужен только один удар, используйте .Single

f_object result = f_objects.Single(obj=>obj.GetName() == name);

или если вы можете иметь только один или ноль попаданий, используйте .SingleOrDefault

f_object result = f_objects.SingleOrDefault(obj=>obj.GetName() == name);
4 голосов
/ 24 ноября 2011
List<...> items = ... ;
string name = ...;
var found = items.Find( i => string.Equals(name, i.GetName()) );
3 голосов
/ 24 ноября 2011

Есть еще люди, которые не могут использовать LINQ в своих проектах, поэтому вот версия без нее:

F_object found = f_objects.Find(delegate(F_object f)
{
    return f.GetName().Equals(name);
});
3 голосов
/ 24 ноября 2011

Вы можете использовать LINQ.

var objectswith_something = f_objects.Where(fo => fo.GetName().Equals(name));

Если вы просто хотите первый, используйте

f_objects.Where(fo => fo.GetName().Equals(name)).FirstOrDefault();`
2 голосов
/ 24 ноября 2011

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

Например, вы бы написали

IEnumerable<F_object> filteredListOff_objects f_objects.Where(f_object=>f_object.GetName() == "something");

Чтобы получить IEnumberable объектов, которые имеютназвание "что-то"

0 голосов
/ 24 ноября 2011

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

string name = "something";
var foundQuery = from s in f_objects
                 where s.Name == name
                 select s;

Я бы объявил свойство Name вместо GetName ().Затем вы можете выполнить итерацию с foreach по запросу:

foreach (string s in foundQuery)
   ...

или преобразовать его в List <> или массив с ToList или ToArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...