加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从列表中删除子列表

发布时间:2020-12-15 18:20:41 所属栏目:百科 来源:网络整理
导读:我有2个列表:list1和list2(都是int类型) 现在我想从list1中删除list2的内容.我怎么能在C#中做到这一点? PS:不要使用循环. 解决方法 重要的变化 正如评论中指出的那样,.Except()在内部使用了一个集合,因此在最终结果中将缺少list1的任何重复成员. Produces
我有2个列表:list1和list2(都是int类型)

现在我想从list1中删除list2的内容.我怎么能在C#中做到这一点?

PS:不要使用循环.

解决方法

重要的变化

正如评论中指出的那样,.Except()在内部使用了一个集合,因此在最终结果中将缺少list1的任何重复成员.

Produces the set difference of two sequences

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx

但是,有一个解决方案既是O(N)又保留了原始列表中的重复项:修改RemoveAll(i => list2.Contains(i))方法以使用HashSet< int>举行排除集.

List<int> list1 = Enumerable.Range(1,10000000).ToList();
HashSet<int> exclusionSet = Enumerable.Range(500000,10).ToHashSet(); 

list1.Remove(i => exclusionSet.Contains(i));

扩展方法ToHashSet()在MoreLinq中可用.

原始答案

你可以使用Linq

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

UPDATE

出于好奇,我对@ HighCore的解决方案进行了简单的基准测试.

对于只有一个元素的list2,他的代码更快.随着list2变得越来越大,他的代码变得极其缓慢.它看起来像是O(N平方)(或更具体地是O(list1.length * list2.length),因为list1中的每个项目都与list2中的每个项目进行比较).没有足够的数据点来检查我的解决方案的Big-O,但是当list2具有多个元素时,它会快得多.

用于测试的代码:

List<int> list1 = Enumerable.Range(1,10000000).ToList();
        List<int> list2 = Enumerable.Range(500000,10).ToList(); // Gets MUCH slower as 10 increases to 100 or 1000

        Stopwatch sw = Stopwatch.StartNew();

        //list1 = list1.Except(list2).ToList();
        list1.RemoveAll(i => list2.Contains(i));

        sw.Stop();

        var ms1 = sw.ElapsedMilliseconds;

更新2

此解决方案为变量list1分配新列表.正如@Толя指出的那样,原始list1的其他引用(如果有的话)将不会更新.除了最小尺寸的list2之外,这个解决方案的性能远远超过RemoveAll.如果没有其他引用必须看到更新,那么最好是因为这个原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读