更新多个列表中的一个对象的最佳方式
本文关键字:一个对象 方式 最佳 列表 更新 | 更新日期: 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);
}