2017-07-13 11 views
0

私は見えクラスを持っているように:私はプロパティを更新するメソッドを呼び出してのActionResult Updateで私のコントローラで次にASP.NET MVC C#のobservリストとホールド削除され、追加された項目

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

    } 
} 

private bool UpdateProperties(IUser current, IUser update, out IUser result) 
{ 
    result = current; 

    // Update areas 
    ... 

    return true; 
} 

だからここに私は次のような結果が欲しい:結果の

  1. _areaCollectionは、更新されたリストが含まれています
  2. _removedAreasは更新
  3. _addedAreasに基づいて削除された領域が更新

に基づいて追加された領域が含まれています。しかし、私はこの上で立ち往生していますが含まれています。

+0

すべてが非公開の場合、ObservableCollectionの目的は何ですか? Disable/Enableメソッドの中にあなたのロジックをカプセル化するだけでいいのですか?また、あなたが達成しようとしていることを理解することは本当に難しいですが、問題は明らかではありません。何が効いていないのですか? –

+0

削除された領域と追加された領域のプロパティを2つ公開しました。私はデータベースを簡単に更新できるように、削除された領域と追加された領域を保持したい。最初に、RemovedAreasプロパティを調べて領域を削除し、AddedAreasプロパティを調べて挿入を行います。 – Mivaweb

+0

私の質問はまだ残っています。なぜなら、ObservableCollectionの代わりに 'List'を使い、' EnableArea'/'の内部に' _addedAreas.Add(item); 'と' _removedAreas.Add(item) 'DisableArea'メソッド?これにより、クラスが簡素化されます。 –

答えて

1

間違った方法で問題に近づいていると思います。あなたが望むものを理解することは、2つのコレクションの違いを知ることです。この目的のために、ObservableCollectionはまったく必要ありません。削除する要素と追加する要素をフィルタリングするだけで済みます。両方がAreasと呼ばれる読み取り/書き込みプロパティが含まれていcurrentupdatedと仮定すると、

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

本当に非効率的です。

+0

私はまた、オブジェクト全体を更新するのではなく、領域を編集するためだけにこれらのメソッドを使用します。しかし、多分何かを考え直すべきだ。 – Mivaweb

+0

助けてくれてありがとう、私は魔法を実行し、2つの他のメソッドを削除した 'UpdateArea()'メソッドを作成しました。 – Mivaweb

関連する問題