我有一个看起来像这样的课程:
private ObservableCollection<string> _areaCollection;
private List<string> _removedAreas;
private List<string> _addedAreas;
public Constructor()
{
_areaCollection = new ObservableCollection<string>();
_areaCollection.CollectionChanged += AreaCollectionChanged;
_removedAreas = new List<string>();
_addedAreas = new List<string>();
}
public IEnumerable<string> Areas { get { return _areaCollection; } }
public IEnumerable<string> AddedAreas
{
get { return _addedAreas; }
}
public IEnumerable<string> RemovedAreas
{
get { return _removedAreas; }
}
public void DisableArea(string areaAlias)
{
if (_areaCollection.Contains(areaAlias))
_areaCollection.Remove(areaAlias);
}
public void EnableArea(string areaAlias)
{
if (!_areaCollection.Contains(areaAlias))
_areaCollection.Add(areaAlias);
}
private void SectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
var item = e.NewItems.Cast<string>().First();
if (_addedAreas.Contains(item) == false)
{
_addedAreas.Add(item);
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
var item = e.OldItems.Cast<string>().First();
if (_removedAreas.Contains(item) == false)
{
_removedAreas.Add(item);
}
}
}
然后在我的控制器上更新actionresult我调用一个方法来更新属性:
private bool UpdateProperties(IUser current, IUser update, out IUser result)
{
result = current;
// Update areas
...
return true;
}
所以我想要以下结果:
_areaCollection
结果包含更新后的列表_removedAreas
包含根据更新_addedAreas
包含根据更新添加的区域但我坚持这个。
答案 0 :(得分:1)
我相信你正以错误的方式接近你的问题。根据我的理解你想要的是知道两个集合之间的差异。为此,您根本不需要ObservableCollection
,只需要过滤删除哪些元素以及添加哪些元素。
假设current
和updated
都包含名为Areas
的读/写属性:
var updatedSet = new HashSet<string>(updated.Areas);
var currentSet = new HashSet<string>(current.Areas);
var added = updatedSet.Where(a => !currentSet.Contains(a));
var removed = currentSet.Where(a => !updatedSet.Contains(a));
current.Areas = updated.Areas;
如果您确实需要将Areas
属性设为只读,则可以使用以下代码更改最后一行:
foreach(var item in added)
current.EnableArea(item);
foreach(var item in removed)
current.DisableArea(item);
这实在是效率低下。