Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC观察列表和保留删除和添加的项目_C#_Asp.net Mvc_Observable - Fatal编程技术网

C# ASP.NET MVC观察列表和保留删除和添加的项目

C# ASP.NET MVC观察列表和保留删除和添加的项目,c#,asp.net-mvc,observable,C#,Asp.net Mvc,Observable,我有一个类,看起来像: private ObservableCollection<string> _areaCollection; private List<string> _removedAreas; private List<string> _addedAreas; public Constructor() { _areaCollection = new ObservableCollection<string>(); _are

我有一个类,看起来像:

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

    }
}
因此,我希望得到以下结果:

_结果的areaCollection包含更新的列表 _removedAreas包含根据更新删除的区域 _addedAreas包含根据更新添加的区域
但是我被这件事难住了。

我相信你用错误的方式处理你的问题。据我所知,你想知道两个系列之间的区别。为此,您根本不需要ObservableCollection,只需要过滤哪些元素被删除,哪些元素被添加

假设“当前”和“更新”都包含一个名为“区域”的读/写属性:


这是非常低效的。

如果所有东西都是私有的,那么可观察收集的目的是什么?为什么不把逻辑封装在Disable/Enable方法中呢?而且,要理解你想要达到的目标确实很困难,问题一点也不清楚。什么不起作用?忘记了删除和添加区域的2个公共获取属性。我想保留删除和添加的区域,以便轻松更新数据库。因此,首先我通过查看RemovedAreas属性删除区域,然后通过查看AddedAreas属性进行插入。我的问题仍然是,为什么不使用列表而不是ObservableCollection,然后放置_AddAreas.Additem;和_removedAreas.Additem;内部启用区域/禁用区域方法?这将简化您的类。好吧,那么,我如何同步2个对象的areaCollection并获得我想要的结果呢?我还使用这些方法仅编辑区域,而不是更新整个对象。但是也许这是需要考虑的。谢谢你的帮助,我已经创建了一个UpdateArea方法,在这里我做了魔术,并删除了另外两个方法。
 private bool UpdateProperties(IUser current, IUser update, out IUser result)
 {
    result = current;

    // Update areas
    ...

    return true;
 }
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;
foreach(var item in added)
    current.EnableArea(item);
foreach(var item in removed)
    current.DisableArea(item);