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;
}
}
然而,這恰恰感覺就像重新發明輪子。有沒有這樣的東西呢?這似乎是其他人已經解決的問題。
有沒有更好的方法?
是的,我可以做一些像'var newItems = first.Except(second); var removedItems = second.Except(first);'仍然是兩個循環而不是一個(我懷疑還有兩個'HashSet'用於比較),但這是朝着正確方向邁出的一步:) – Keith
感謝鼓勵! – pasty