Поиск списка объектов на основе переменной объекта - PullRequest
12 голосов
/ 01 июля 2010

У меня есть список объектов. Эти объекты имеют три переменные: ID, имя и значение. В этом списке может быть много объектов, и мне нужно найти объект на основе идентификатора или имени и изменить значение. Пример

class objec
{
    public string Name;
    public int UID;
    public string value;
}
List<objec> TextPool = new List<objec>();

Как мне найти одну запись в TextPool с именем «test» и изменить ее значение на «Value». Настоящая программа имеет гораздо больше параметров поиска и значений, которые необходимо изменить, поэтому я не мог просто использовать словарь (хотя Name и UID или уникальные идентификаторы). Любая помощь будет великолепна

Ответы [ 4 ]

31 голосов
/ 01 июля 2010

Вы можете использовать LINQ, чтобы найти его, а затем напрямую изменить элемент:

var item = TextPool.FirstOrDefault(o => o.Name == "test");
if (item != null)
       item.value = "Value";

Если вы хотите изменить все соответствующие элементы, вы можете, потенциально, даже сделать:

TextPool.Where(o => o.Name == "test").ToList().ForEach(o => o.value = "Value");

Однако лично я предпочел бы разделить его, так как я считаю, что второй вариант менее удобен в обслуживании (выполнение операций, которые вызывают побочные эффекты непосредственно в результате запроса, «пахнет» для меня) ...

2 голосов
/ 01 июля 2010
var find = TextPool.FirstOrDefault(x => x.Name == "test");
if (find != null)
{
    find.Name = "Value";
}
1 голос
/ 01 июля 2010

Звучит как работа для LINQ !

var matchedObject =
   from t in TextPool
   where t.UName == "test"
   select t;

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

[Редактировать: был разбит на удар, но оставил это как пример другого синтаксиса, плюс ссылка]

0 голосов
/ 01 июля 2010
List<objec> TextPool = new List<objec>();
objec found = TextPool.FirstOrDefault(item => item.Name == "test");
if (found != null) found.value = "Value";

Если вы собираетесь выполнять много поисков, вы можете кэшировать результаты в нескольких экземплярах Dictionary <> (или Lookup <>, если ключи не уникальны).

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