2016-11-25 5 views
-1

私はリストを持っています。このリストには、次のようなものがあります。リストにあるかどうかチェックし、古いアイテムを削除する

List<T> {Soc1, Soc2, Soc3} 

とSoc複合オブジェクトがあります。その後、私はリストを変更します(1,3

List<T> {Soc1, Soc3, Soc4} 

さて、デシベルで、私は、最初のリスト(1,2,3)を持っていると私は新しいものに更新する必要があります。SOC2を削除し、Soc4を追加、4)。どのようにC#でこのチェックを行うには?私は、リストの方法が

foreach(T t in oldList){ 
if(t.Contains(oldList)){ 
...} 

が含まれている使用のための新しい項目(複数可)を追加しようが、私は(この例ではSOC2)がもはや存在しない要素の除去に停止します。実行する方法?おかげ

答えて

0

は、次の2つのループを行うと、LINQを使用することができます:あなたがリストを変更する場合

// add the new ones... 
foreach (var newItem in newList.Where(n => !oldList.Any(o => o.Id == n.Id))) { 
    oldList.Add(newItem); 
} 

// remove the redundant ones... 
var oldIds = oldList.Select(i => i.Id); 
foreach (var oldId in oldIds) { 
    if (!newList.Any(i => i.Id == oldId)) { 
     oldList.Remove(oldList.First(i => i.Id == oldId)); 
    } 
} 
1

のforeachは解除されます(項目を削除します)。したがって、代わりに使用する方が良いです。 古いリストではもう存在しない要素を削除するためにしばらくしてから、新しい項目を追加するために新しいリストを作成します。

List<T> oldList = new List<T> { Soc1, Soc2, Soc3 }; 
List<T> newList = new List<T> { Soc1, Soc3, Soc4 }; 

int i = 0; 
// Go trough the old list to remove items which don't exist anymore 
while(i < oldList.Count) 
{ 
    // If the new list doesn't contain the old element, remove it from the old list 
    if (!newList.Contains(oldList[i])) 
    { 
     oldList.RemoveAt(i); 
    } 
    // Otherwise move on 
    else 
    { 
     i++; 
    } 
} 

// Now go trough the new list and add all elements to the old list which are new 
foreach(T k in newList) 
{ 
    if (!oldList.Contains(k)) 
    { 
     oldList.Add(k); 
    } 
} 
関連する問題