[英]best way to update object in one of many lists
我正在尝试找到更新对象的最佳方法,该对象可能来自少数几个不同的列表/集合
例:
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;
}
但似乎应该有更好的方法
有小费吗?
这些集合中可能包含数百个项目,后面的项目可能更多,因此我试图找到最有效的方式来处理更新。
您可以使用null-coalescing运算符 ( ??
)简化代码:
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);
}
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);
同样值得一看的是edulinq serie中Jon Skeet的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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.