更新通用列表中元素的最佳方法

时间:2013-10-09 19:34:16

标签: c# generic-list

假设我们有一个名为Dog的类,其中包含两个字符串“Name”和“Id”。现在假设我们有一张包含4只狗的清单。如果您想更改“Id”为“2”的Dog的名称,那么最好的方法是什么?

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);

3 个答案:

答案 0 :(得分:84)

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

然而,更安全的版本可能就是这样:

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

答案 1 :(得分:6)

你可以这样做:

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

这将返回匹配的狗,否则它将返回null

然后您可以设置如下属性:

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

答案 2 :(得分:0)

如果列表已排序(正如在示例中那样),索引上的二进制搜索肯定有效。

    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版本是什么。