【问题标题】:make the remove from a list with condition in fastest way以最快的方式从有条件的列表中删除
【发布时间】:2018-03-27 04:00:57
【问题描述】:

有没有其他方法可以从列表中删除对象 而不是我对 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);
    }
}

【问题讨论】:

  • 将属性添加到所有对象IsSelected,然后如果属性为true,则删除对象,或者使用选定对象的名称创建一个hashSet并检查对象的名称是否在hashset中。
  • 条件是用户名
  • 条件在哪个属性上并不重要。在您的代码中,当您将对象添加到 myobj 时,您可以将其设置为 IsSelectedtrue,然后稍后将其删除。
  • 所有对象列表中是否存在选定对象? (有相同的参考)
  • 对象来自instagram

标签: c# .net arrays list foreach


【解决方案1】:

如果这些列表中的对象具有相同的引用,那么要获取 除了选定项目之外的所有对象,您可以简单地使用:

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

如果它们没有相同的引用,您可以这样创建结果:

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

【讨论】:

  • 如果一个列表中可以有两个具有相同引用的项目,第一种方法将无法按预期工作..
  • @M.kazemAkhgary 第一个选项,从所有项目中删除选定项目的所有实例,无论出现次数如何。所以基本上它按预期工作。
【解决方案2】:

其他答案有缺点,那就是“创建不包括选定项目的新集合”,而不是从实际集合中删除项目。

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

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

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

【讨论】:

    【解决方案3】:

    您无法从正在迭代的列表中删除。

    无论如何,您都可以构建一个新列表,其中包含全局列表中不存在用户名的所有元素:

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

    【讨论】:

    • OP 未从迭代列表中删除。迭代集合是数组
    【解决方案4】:

    如果您想从myobj 中删除UserName 存在于allobj 中的对象,那么

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 2019-06-27
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多