2017-10-15 12 views
1

リストからオブジェクトを削除する方法はありますか foreachで行ったのではなく、最も速い方法で条件付きのリストから削除する

私は私のやり方が最善の方法であると考え、このような方法

を最適化していない意味:

var allobj= .. //this a list of all object 
var myobj= .. //this a list of my selected object 
foreach (var inu in myobj.ToArray()) 
{ 
    if (allobj.Where(p => p.UserName == inu.UserName).Count() != 0) 
    { 
     myobj.Remove(inu); 
    } 
} 
+0

すべてのオブジェクトにプロパティを追加し、プロパティが「true」の場合はオブジェクトを削除するか、選択したオブジェクトの名前でハッシュセットを作成し、オブジェクトの名前がハッシュセットにあるかどうかを確認します。 – FCin

+0

条件がユーザー名の上にある – keuone72

+0

条件がどのプロパティであるかは関係ありません。あなたのコードで、 'myobj'にオブジェクトを追加すると' IsSelected'を 'true'に設定し、後でそれを削除することができます。 – FCin

答えて

4

他の回答には欠点があり、それは「選択した項目を除いた新しいコレクションを作成する」の代わりに、取り外しています実際のコレクションからのアイテム。

このアプローチでは、メインコレクションからコピーされません。リストから項目を最適な速度で直接削除します。

選択したアイテムからハッシュセットを生成し、ハッシュセット内の文字列を一定のスピードで検索することができます。

// generate hashset from selected items 
var set = new HashSet<string>(myobj.Select(x => x.UserName)); 

// remove all items from list. 
allobj.RemoveAll(x => set.Contains(x.UserName)); 
1

あなたがに反復されているリストから削除することはできません。その後、

var finalList = myobj.Where(obj => allobj.Any(o => o.UserName != 
obj.UserName)).ToList(); 
+2

OPから来ています。反復リストからOPは削除されません。繰り返しコレクションが配列 – Fabio

1

あなたはUserNameallobjに存在するmyobjからオブジェクトを削除したい場合は、

var selected = myobj.Where(obj => allobj.Any(o => o.UserName == obj.UserName)).ToList(); 

はとにかくあなたはユーザ名がグローバルリストに存在しないすべての要素を含む新しいリストを構築することができます

1

これらのリスト内のオブジェクトの参照が同じ場合は、を選択したアイテムを除くすべて

var r = allItems.Except(selectedItems).ToList(); 

彼らは同じ参照を持っていない場合は、この方法の結果を作成することができますが:

var r = allItems.Where(x => !selectedItems.Any(y => y.UserName == x.UserName)).ToList(); 
+0

の場合、1つのリスト内に同じ参照を持つ2つのアイテムがある場合、最初の方法は期待どおりに機能しません.. –

+0

@ M.kazemAkhgary最初のオプションは、外観。だから、基本的に期待どおりに動作します。 –

関連する問題