使用条件最快的方式从列表中删除
是否有任何替代方法可以从列表中删除对象 而不是我用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);
}
}
其他答案有缺点,那就是“创造新的集合不包括所选项目”,而不是删除来自实际收藏的物品。
此方法不会从主集合中复制,它会以最佳速度直接从列表中删除项目。
您将从您选择的项目生成哈希集,以便您可以以恒定速度在哈希集中查找字符串。
// 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();
OP不从迭代列表中删除。重复集合是数组 – Fabio
如果你想从myobj
这UserName
存在于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();
如果在一个列表中可能有两个具有相同引用的项目,则第一种方法将无法按预期工作。 –
@ M.kazemAkhgary第一个选项从所有项目中删除所有项目的所有实例,而不考虑出现。所以基本上它按预期工作。 –
属性添加到所有对象'IsSelected'然后删除对象如果属性为TRUE;或让与所选对象的名称HashSet的,检查对象的名称是在HashSet的。 – FCin
条件在用户名 – keuone72
条件属于哪个属性无关紧要。在你的代码中,当你将对象添加到'myobj'时,你可以将它设置为'IsSelected'为'true',然后再删除它。 – FCin