【问题标题】:Best way to replace a Item in a List by ID按 ID 替换列表中项目的最佳方法
【发布时间】:2018-08-17 18:00:43
【问题描述】:

我有一个具有一个 ID 和多个其他属性的简单类

public class Item
{
    public int ID { get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

现在我有一个 List<Item> 有很多这些项目

List<Item> items = new List<Item>()
{
    new Item() { ID = 1, Prop1="foo" , Prop2= "foo" },
    new Item() { ID = 2, Prop1="foo" , Prop2= "foo" },
    new Item() { ID = 3, Prop1="foo" , Prop2= "foo" }
};

问题:当我想用更新的 ID 替换 Item 时,有没有比这更好/更聪明的方法:

//new Item
Item replacement = new Item() { ID = 2, Prop1 = "bar", Prop2 = "bar" };

items.RemoveAll(x => x.ID == replacement.ID);
items.Add(replacement);
items = items.OrderBy(x => x.ID).ToList();

【问题讨论】:

    标签: c# arrays list class


    【解决方案1】:

    如果您需要进行完全替换而不仅仅是更新(您可以简单地找到对象,并一个一个地复制属性),您可以通过找到它的索引然后直接替换它来省去一些麻烦,而不是删除、添加和重新排序。

    int index = items.FindIndex(item => item.ID == replacement.ID);
    if (index >= 0)
    {
        items[index] = replacement;
    }
    

    替换的位置与原来的位置相同。

    【讨论】:

    • 如果有多个具有相同 ID 的记录并且 OP 想要替换所有这些记录怎么办?在您的回答中,您只是获得了 item.ID == replacement.ID 为真的单个索引。如果我错了,请纠正我
    • @Prasad,他问题的措辞让我相信 ID 标识了一条唯一的记录。如果这是一个错误的假设,那么它需要澄清(并且不费吹灰之力,这可能会变成一个循环)。
    【解决方案2】:
    • 由于您正在对列表进行排序,因此您还可以使用二进制排序来查找要删除和添加的索引。

    • 也不需要同时添加和删除它。您可以找到该项目并更改其属性。为您节省删除和订购操作。

    • 如果您有很多项目,使用以 Id 为键的字典将使您的查找速度更快。在这种情况下,ID 必须是唯一的。

    【讨论】:

    • RemoveAll 的 OP 使用表明 Id 在列表中不是唯一的。如果结果是错误的并且 ID 是唯一的,那么这可能是最好的方法。
    • 你是对的,对于字典,键必须是唯一的。使用二进制文件应该仍然有效。
    • 在我看来,使用 ID 字段往往表示唯一性。考虑到问题的措辞,我也会做出这样的假设。
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2017-08-23
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多