【问题标题】:What is the most efficient way to split a List into two Lists based on one condition? [closed]根据一个条件将列表拆分为两个列表的最有效方法是什么? [关闭]
【发布时间】:2021-08-04 12:11:54
【问题描述】:

我想将一个列表分成两个单独的列表,一个包含满足条件的元素,另一个包含不满足条件的元素。 一个可能的解决方案是:

var listTrue = list.Where(x => x.condition());
var listFalse = list.Where(x => !x.condition());

但我不只是在寻找解决方案。我正在寻找一个有效的解决方案。我不要求任何性能指标。 我很乐意收到想法和解决方案。我会对这些进行基准测试,看看它们中的任何一个是否能显着提高性能。 我也在寻找 .net framework 4.8 中可用的解决方案。

【问题讨论】:

标签: c# .net performance


【解决方案1】:

就性能而言,最有效的方法是执行foreach 循环,该循环将以O(n) 的复杂性完成。尽管我建议您只使用您提到的 LINQ,即O(2n) = O(n)。如果您的列表包含很多行,并且您确实需要最高效的性能,那就去吧:

 var listTrue = new List<...>();
 var listFalse = new List<...>();

 foreach (var item in list)
 {
     if (item.condition())
     {
         listTrue.Add(item);
     }
     else
     {
         listFalse.Add(item);
     }
 }

注意,如果逻辑上合理,您也可以并行执行。

【讨论】:

  • 从技术上讲,它们都具有O(n)(线性)复杂度,但您说 LINQ 版本需要 2 次迭代是正确的。
  • 一个基本的,如果它在被操纵的集合上可用,列表就是这种情况,将会更加优化。也许 AddRange 也带有预分配的数组(当时没有考虑这一点)。
  • O(2n) == O(n)
  • 对于小于 2¹⁶ 的 n,for 循环效率提高 4%,对于 2¹⁶ - 2³⁰,访问列表的私有后备字段效率更高,将其加载到连续的内存块中并使用 for 循环进行迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多