
现在我想从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.如果没有其他引用必须看到更新,那么最好是因为这个原因.
总结以上是内存溢出为你收集整理的c# – 从列表中删除子列表全部内容,希望文章能够帮你解决c# – 从列表中删除子列表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)