2013-05-20 33 views
1

我有一個保存更改列表的網頁,因此在保存操作中,我有兩個列表,一個列出新值,一個列出現有列表那些。將.Net中的兩個列表與行爲進行比較,具體取決於列表中的項目在

我想:

  • 遍歷兩個列表,被聯合和重複數據刪除。
  • 在新列表中而不是在現有列表中,我想添加一個新項目。
  • 在這兩個列表中,我想跳過它。
  • 哪裏在現有的列表,但不是在新的我想刪除該項目。

這是很容易敲起來要做到這一點,類似的方法:

public static IEnumerable<UnionCompared<T>> UnionCompare<T>(
    this IEnumerable<T> first, IEnumerable<T> compare, IEqualityComparer<T> comparer = null) 
{ 
    // Create hash sets to check which collection the element is in 
    var f = new HashSet<T>(first, comparer); 
    var s = new HashSet<T>(compare, comparer); 

    // Use Union as it dedupes 
    var combined = first.Union(compare, comparer); 
    foreach (var c in combined) 
    { 
     // Create a type that has the item and a flag for which collection it's in 
     var retval = new UnionCompared<T> 
     { 
      Item = c, 
      InFirst = f.Contains(c), 
      InCompare = s.Contains(c) 
     }; 

     yield return retval; 
    } 
} 

然而,這恰恰感覺就像重新發明輪子。有沒有這樣的東西呢?這似乎是其他人已經解決的問題。

有沒有更好的方法?

回答

1

如果你的T型具有獨特的鍵(字符串或ID),那麼我會建議提取出所有的鑰匙,把它們放在一個列表類型字符串INT和使用Intersect and Except擴展方法,以獲取重複/遺失/新項目或寫一個IEqualityComprer - 爲您的自定義類型T實施並再次使用列表擴展方法。

最後,我認爲這個解決方案將會或多或少地執行與您的實現相同數量的代碼。我只是總是嘗試使用框架已經提供的內容。 :-)

+0

是的,我可以做一些像'var newItems = first.Except(second); var removedItems = second.Except(first);'仍然是兩個循環而不是一個(我懷疑還有兩個'HashSet'用於比較),但這是朝着正確方向邁出的一步:) – Keith

+0

感謝鼓勵! – pasty

相關問題