更新多个列表中的一个对象的最佳方式

本文关键字:一个对象 方式 最佳 列表 更新 | 更新日期: 2023-09-27 18:28:53

我正在努力寻找更新对象的最佳方法,该对象可能位于少数不同列表/集合中的一个

示例:

public class MyItem
{
    public Guid Id { get; set; }
    public string Name { get; private set; }
    public string Status { get; private set; }
    public MyItem(string name)
    {
        this.Id = new Guid();
        this.Name = name;
    }
    public void UpdateStatus(string status)
    {
        this.Status = status;
    }
}
public class OtherClass
{
    public ObservableCollection<MyItem> ItemList1;
    public ObservableCollection<MyItem> ItemList2;
    public ObservableCollection<MyItem> ItemList3;
    public UpdateStatus(Guid id, string status)
    {
        // Figure out which ItemList needs to be updated
        var item = ItemList1.FirstOrDefault(s => s.Id == id);
        if (item == null)
        {
            item = ItemList2.FirstOrDefault(s => s.Id == id);
            if (item == null)
            {
                item = ItemList3.FirstOrDefault(s => s.Id == id);
                if (item == null)
                {
                    Debug.WriteLine("Unable to update Status");
                    return;
                }
            }
        }
        item.UpdateStatus(status);
    }
}

我不喜欢嵌套的if,所以我相信有更好的方法,但现在是星期五,我的大脑被炸了:(

我意识到我可以添加这样的东西,而不是嵌套的ifs:

public MyItem UpdatedStatus(ObservableCollection collection, Guid id)
{
    return collection.FirstOrDefault(s => s.Id == id);
}

public bool UpdatedStatus(ObservableCollection collection, Guid id, string status)
{
    var item = collection.FirstOrDefault(s => s.Id == id);
    if (item != null)
    {
        item.UpdateStatus(status);
        return true;
    }
    return false;
}

但似乎应该有一个更好的方法

有什么建议吗?

这些集合中可能有数百个项目,稍后还会有更多项目,所以我正在努力寻找最有效的方法来处理更新。

更新多个列表中的一个对象的最佳方式

LINQ获取帮助。它对你起作用了吗?

var item = ItemList1.Union(ItemList2)
                    .Union(ItemList3)
                    .FirstOrDefault(s => s.Id == id);

重要信息:

Union()返回唯一的元素,它在大型数据集上可能会很慢,所以考虑对大型列表使用Concat()

var item = ItemList1.Concat(ItemList2)
                    .Concat(ItemList3)
                    .FirstOrDefault(s => s.Id == id);

同样值得一看的是Jon Skeet在edulinq系列中的Concat()实现,Concat()非常简单:(全文)

private static IEnumerable<TSource> ConcatImpl<TSource>( 
    IEnumerable<TSource> first, 
    IEnumerable<TSource> second) 
{ 
    foreach (TSource item in first) 
    { 
        yield return item; 
    } 
    foreach (TSource item in second) 
    { 
        yield return item; 
    } 
}

您可以使用空合并运算符(??)来简化您的代码:

public UpdateStatus(Guid id, string status) 
{ 
    var item = ItemList1.FirstOrDefault(s => s.Id == id)
        ?? ItemList2.FirstOrDefault(s => s.Id == id)
        ?? ItemList3.FirstOrDefault(s => s.Id == id)
    if (item == null) 
    { 
        Debug.WriteLine("Unable to update Status"); 
        return; 
    } 
    item.UpdateStatus(status); 
}