C# 从第二个列表中删除元素

C# 从第二个列表中删除元素,c#,list,removeall,C#,List,Removeall,我想从列表2中删除属于列表1的所有元素。 我注意到,如果我的代码在两个列表中都有50k个元素,那么它的速度会非常慢。我正在迭代列表1中的所有元素,若元素包含在列表2中,我将从列表2中删除此类元素。 什么是有效的方法 public static int RemoveDuplicatesFromSecondRange(List<string> list1, List<string> list2) { int removed

我想从列表2中删除属于列表1的所有元素。 我注意到,如果我的代码在两个列表中都有50k个元素,那么它的速度会非常慢。我正在迭代列表1中的所有元素,若元素包含在列表2中,我将从列表2中删除此类元素。 什么是有效的方法

        public static int RemoveDuplicatesFromSecondRange(List<string> list1, List<string> list2)
        {
           int removed = 0;

           foreach (string el in list1)
           {
              list2.Remove(el);
              removed++;
           }

           return removed;
        }

我会让你做性能测试

public static int RemoveDuplicatesFromSecondRange2(List<string> list1, List<string> list2)
{
  var exCount = list2.Select(s => s).Except(list1).Count();
  return list2.Count - exCount;
}
它首先创建一个索引数据结构,允许在列表中进行更快的查找,而不是在列表2的每个元素的每个测试中扫描整个列表1

您的代码似乎只需要计数,但您的问题说您需要删除条目的列表

public static List<string> RemoveDuplicatesFromSecondRange4(List<string> list1, List<string> list2)
{
  return list2.Select(s => s).Except(list1).ToList();
  /* OR
  var h = new HashSet<string>(list1);
  return list2.Select(s => s).Except(h).ToList();
  */
}

也许这个解决方案是有效的。因为它
复杂性在

使用for循环,使用iflist1.Containslist2[x]这可能会给您带来一些提升。对于这种情况,更好的解决方案是使用LinkedList。您忘记在答案中提供此解决方案…这就是解决方案。我认为这是最好的解决办法。代码的复杂性仍然很不清楚这个解决方案是什么意思。。。很明显,你不是在讨论问题中的代码,它是Olist1.len*list2.len,通常是在^2上。。。对于未来的答案,请尝试提供不需要注释来澄清的完整答案。list2.Clear也只在list2中进行了清除,因此我会这样做:list2=list.Exceptlist1.ToList@Nenadbieršev:更新了,谢谢。现在更好了,但应该是返回list2.Count-list1.Count@Nenadbieršev:从列表2中删除的项目数是原始大小和结果大小之间的差异。列表1包含所有项,而列表2是一个子集。这就是为什么我认为list1.Count-list2.Count是正确的。嗨,它不正确。该函数正在从列表2中删除列表1中的所有元素。表示列表1不是完整大小。您需要在第一行声明一个变量int total=list.Count,然后返回total-list2.Count。
public static int RemoveDuplicatesFromSecondRange(List<string> list1, List<string> list2)
{
  var beforeCount = list2.Count;

  var inList2Only = list2.Except(list1).ToList();

  list2.Clear();
  list2.AddRange(inList2Only);

  return beforeCount - inList2Only.Count;
}
public static int RemoveDuplicatesFromSecondRange(List<string> list1, List<string> list2)
{
  var beforeCount = list2.Count;

  var inList2Only = list2.Except(list1).ToList();

  list2.Clear();
  list2.AddRange(inList2Only);

  return beforeCount - inList2Only.Count;
}