使用条件最快的方式从列表中删除

问题描述:

是否有任何替代方法可以从列表中删除对象 而不是我用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

属性添加到所有对象'IsSelected'然后删除对象如果属性为TRUE;或让与所选对象的名称HashSet的,检查对象的名称是在HashSet的。 – FCin

+0

条件在用户名 – keuone72

+0

条件属于哪个属性无关紧要。在你的代码中,当你将对象添加到'myobj'时,你可以将它设置为'IsSelected'为'true',然后再删除它。 – FCin

其他答案有缺点,那就是“创造新的集合不包括所选项目”,而不是删除来自实际收藏的物品。

此方法不会从主集合中复制,它会以最佳速度直接从列表中删除项目。

您将从您选择的项目生成哈希集,以便您可以以恒定速度在哈希集中查找字符串。

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

你不能从你迭代到列表中删除。

反正你可以构建一个包含所有元素的新列表,其中的用户名不存在在全局列表:

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

OP不从迭代列表中删除。重复集合是数组 – Fabio

如果你想从myobjUserName存在于allobj删除对象,然后

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

如果这些列表中的对象具有相同的参考,则可以获得除选定的项目外您可以简单地使用:

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

如果它们不具有相同的参考,您可以创建的结果是这样的:

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

如果在一个列表中可能有两个具有相同引用的项目,则第一种方法将无法按预期工作。 –

+0

@ M.kazemAkhgary第一个选项从所有项目中删除所有项目的所有实例,而不考虑出现。所以基本上它按预期工作。 –