Поисковый список объектов на основе переменной объекта

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

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

Как я нашел бы одну запись в TextPool, который имел Название 'теста', и измените его значение для 'Оценивания'. Реальная программа имеет намного больше параметров поиска и значений, которым нужно изменение, таким образом, я не мог только использовать Словарь (хотя Имя и UID или уникальные идентификаторы). Любая справка была бы большой

12
задан Ben 9 September 2014 в 22:39
поделиться

4 ответа

Вы можете использовать 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");

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

32
ответ дан 2 December 2019 в 04:08
поделиться

Похоже, работа для LINQ !

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

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

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

1
ответ дан 2 December 2019 в 04:08
поделиться
List<objec> TextPool = new List<objec>();
objec found = TextPool.FirstOrDefault(item => item.Name == "test");
if (found != null) found.value = "Value";

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

0
ответ дан 2 December 2019 в 04:08
поделиться
var find = TextPool.FirstOrDefault(x => x.Name == "test");
if (find != null)
{
    find.Name = "Value";
}
3
ответ дан 2 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: