Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新多个列表之一中的对象的最佳方法_C#_List_Collections_Observablecollection - Fatal编程技术网

C# 更新多个列表之一中的对象的最佳方法

C# 更新多个列表之一中的对象的最佳方法,c#,list,collections,observablecollection,C#,List,Collections,Observablecollection,我试图找到更新对象的最佳方法,该对象可能位于少数几个不同列表/集合中的一个 例如: 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 G

我试图找到更新对象的最佳方法,该对象可能位于少数几个不同列表/集合中的一个

例如:

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

但似乎应该有更好的办法

有什么建议吗

这些集合中可能有数百个项目,后面的项目中可能会有更多项目,因此我正在尝试找到处理更新的最有效方法。

您可以使用??要简化代码,请执行以下操作:

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); 
} 
你可以用??要简化代码,请执行以下操作:

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

林克寻求帮助。它是否如预期的那样对你有效

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

返回唯一的元素,在大型数据集上可能会很慢,所以考虑使用大列表而不是

var item = ItemList1.Concat(ItemList2)
                    .Concat(ItemList3)
                    .FirstOrDefault(s => s.Id == id);
同样值得一看Jon Skeet在edulinq系列中的Concat实现,Concat非常简单:


林克寻求帮助。它是否如预期的那样对你有效

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

返回唯一的元素,在大型数据集上可能会很慢,所以考虑使用大列表而不是

var item = ItemList1.Concat(ItemList2)
                    .Concat(ItemList3)
                    .FirstOrDefault(s => s.Id == id);
同样值得一看Jon Skeet在edulinq系列中的Concat实现,Concat非常简单:


请不要在标题前加C之类的前缀。这就是标签的作用。请不要在标题前加C之类的前缀。这就是标签的作用。既然联合会将所有的收藏组合成一个,它不会花费最长的时间吗?或者它会按顺序搜索它们吗?Union会比较元素的数量以返回唯一的项目结果集,所以它会相对缓慢。但对于小数据集,这种差异可以忽略。如果您需要更高性能的解决方案-使用LINQ CONCAT问题中定义的任务不需要使用Union。Concat与FirstOrDefault的作用与问题中的代码完全相同。Concat看起来更好,但在检查值之前,它不会仍然将所有项组合在一起吗?我认为@MartinLiversage的答案此时会更好地满足我的需要,因为它不会每次都检查所有的列表。@John:使用Concat是有效的。除非调用ToList或类似的东西,否则不会创建组合集合。您自己的解决方案、我的解决方案和这个Concat解决方案将生成使用相同内存和CPU量的代码。这真的是一个品味和可读性的问题。既然联合会将所有的收藏合并成一个,它不会花费最长的时间吗?或者它会按顺序搜索它们吗?Union会比较元素的数量以返回唯一的项目结果集,所以它会相对缓慢。但对于小数据集,这种差异可以忽略。如果您需要更高性能的解决方案-使用LINQ CONCAT问题中定义的任务不需要使用Union。Concat与FirstOrDefault的作用与问题中的代码完全相同。Concat看起来更好,但在检查值之前,它不会仍然将所有项组合在一起吗?我认为@MartinLiversage的答案此时会更好地满足我的需要,因为它不会每次都检查所有的列表。@John:使用Concat是有效的。除非调用ToList或类似的东西,否则不会创建组合集合。您自己的解决方案、我的解决方案和这个Concat解决方案将生成使用相同内存和CPU量的代码。这实际上是一个品味和可读性的问题。对于我用空检查做了多少个三元操作,这会使它简化很多:对于我用空检查做了多少个三元操作,这会使它简化很多: