Лучший способ обновить элемент в общем списке

Предположим, что у нас есть класс Dog с двумя строками "Name" и "Id". Теперь предположим, что у нас есть список с 4 собаками. Если вы хотите изменить имя собаки с "Id" из "2", что было бы лучшим способом сделать это?

Dog d1 = new Dog("Fluffy", "1");
Dog d2 = new Dog("Rex", "2");
Dog d3 = new Dog("Luna", "3");
Dog d4 = new Dog("Willie", "4");

List<Dog> AllDogs = new List<Dog>()
AllDogs.Add(d1);
AllDogs.Add(d2);
AllDogs.Add(d3);
AllDogs.Add(d4);

Ответ 1

AllDogs.Where(d => d.Id == "2").First().Name = "some value";

Однако более безопасная версия может быть такой:

var dog = AllDogs.Where(d => d.Id == "2").FirstOrDefault();
if (dog != null) { dog.Name = "some value"; }

Как сказал Рид, мы можем просто перейти к First или даже FirstOrDefault здесь:

AllDogs.First(d => d.Id == "2").Name = "some value";

или

var dog = AllDogs.FirstOrDefault(d => d.Id == "2");

Ответ 2

Вы можете сделать:

var matchingDog = AllDogs.FirstOrDefault(dog => dog.Id == "2"));

Это вернет соответствующую собаку, иначе она вернет null.

Затем вы можете установить свойство следующим образом:

if (matchingDog != null)
    matchingDog.Name = "New Dog Name";

Ответ 3

Если список отсортирован (как это бывает в примере), двоичный поиск по индексу, безусловно, работает.

    public static Dog Find(List<Dog> AllDogs, string Id)
    {
        int p = 0;
        int n = AllDogs.Count;
        while (true)
        {
            int m = (n + p) / 2;
            Dog d = AllDogs[m];
            int r = string.Compare(Id, d.Id);
            if (r == 0)
                return d;
            if (m == p)
                return null;
            if (r < 0)
                n = m;
            if (r > 0)
                p = m;
        }
    }

Не уверен, какой будет версия LINQ.