2012-03-23 48 views
1

我試圖找到最好的方法來更新/對象可能是進一出不同的列表屈指可數的藏品最好的辦法

例子:

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

我不喜歡嵌套,如果是這樣我敢肯定有一個更好的方法,但其週五和我的大腦是炒:(

我意識到,我可以像這樣代替嵌套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

請不要用「C#」等來標題。這就是標籤的用途。 – 2012-03-23 15:59:33

回答

3

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的Concat()從edulinq系列實現,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; 
    } 
} 
+0

聯盟會不會花費最長的時間,因爲它會將所有集合合併爲一個?或者它會按順序搜索它們? – John 2012-03-23 16:02:15

+0

'Union()'不會比較元素以返回唯一項目結果集,所以它會相對較慢。但對於小數據集,這種差異可能被忽略。如果您需要更高性能的解決方案 - 請使用LINQ'Concat()' – sll 2012-03-23 16:05:41

+0

問題中定義的任務不需要使用「聯合」。帶有'FirstOrDefault'的'Concat'將與問題中的代碼完全相同。 – 2012-03-23 16:10:47

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

對於我用空檢查完成多少次三元運算的人來說,這會使其簡化很多:) – John 2012-03-23 16:04:55