我正在尝试找到更新对象的最佳方法,该对象可能属于少数不同的列表/集合中的一个
示例:
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;
}
但似乎应该有更好的方法
任何提示?
这些集合中可能包含数百个项目,后面有更多项目,因此我正在尝试找到处理更新的最有效方法。
答案 0 :(得分:3)
您可以使用null-coalescing operator(??
)来简化代码:
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);
}
答案 1 :(得分:3)
LINQ寻求帮助。它是否符合预期?
var item = ItemList1.Union(ItemList2)
.Union(ItemList3)
.FirstOrDefault(s => s.Id == id);
重要的:
Union()会返回唯一元素,在大型数据集上可能会很慢,因此请考虑使用Concat()代替大型列表&#34;
var item = ItemList1.Concat(ItemList2)
.Concat(ItemList3)
.FirstOrDefault(s => s.Id == id);
另外值得一看的是来自edulinq serie的Jon Skeet Concat()
实现,Concat()
非常简单:(Full Article)
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;
}
}