C# 从 List<T> 移除空元素的优化例子

代码评审中偶尔会发现一些通用的性能问题,在此作记录分享。
需求

我们有时候需要延迟删除 List<T> 中的元素,那时候会先把元素设为 null,最后才一次移除所有空元素。

优化前

static void RemoveNull<T>(List<T> list) {
    for (int i = list.Count - 1; i >= 0; i--)
        if (list[i] == null)
            list.RemoveAt(i); // O(n)
}

 由于 RemoveAt() 是 时间的操作,整个函数是 。但这个问题只需要 时间。

优化后

只要把第一个空元素之后的非空元素往前移,就能实现。

static void RemoveNull<T>(List<T> list) {
    // 找出第一个空元素 O(n)
    int count = list.Count;
    for (int i = 0; i < count; i++)
        if (list[i] == null) {
            // 记录当前位置
            int newCount = i++;

            // 对每个非空元素,复制至当前位置 O(n)
            for (; i < count; i++)
                if (list[i] != null)
                    list[newCount++] = list[i];

            // 移除多余的元素 O(n)
            list.RemoveRange(newCount, count - newCount);
            break;
        }
}

 List<T> 实际上也提供 RemoveAll(Predicate<T>) 的接口(参考实现),可以 完成相同工作。但在目前 Unity 的 IL2CPP 下,因 delegate 的调用成本,自行实现会稍快一些。

C++ 可用 std::remove, std::remove_if,因为支持内联不需考虑调用成本。

时间: 2024-09-20 14:59:26

C# 从 List<T> 移除空元素的优化例子的相关文章

php 删除重复数组元素与空元素代码

php删除数组指定元素可以通过以下两种方法实现: 1.遍历数组,然后判断元素的值是否指定值,如果是则用unset()删除.示例代码如下:  代码如下 复制代码 //$var是要删除的元素值,$array是目标数组: function array_del($var,$array){  $i=0;  foreach($array as $val){   if($var==$val){    unset($array[$i]);    break;   }   $i++;  }  return $ar

c# 如何在XML文件中生成空元素的问题

问题描述 我在用c#开发的程序中要生成XML文件,XML文件生成后缺省的空元素在XML文件中是如下方式存储的,比如<DATA></DATA>但我们要求对空元素的存储不能换行(没办法这是要求),必须在同一行现实,比如<DATA></DATA>或者</DATA>这种方式也行,我不知道该如何设置空元素的文件存储方式,请大家指点下 解决方案 解决方案二: 十一快乐!顶解决方案三: stringfileName="Books.xml";

二维数组如何去掉空元素

问题描述 我的二维数组是:onworkidlist(0,0)="1"onworkidlist(0,1)=""onworkidlist(1,0)="加班上班卡"onworkidlist(1,1)=""如何把空元素去掉,得到结果为:onworkidlist(0,0)="1"onworkidlist(1,0)="加班上班卡"谢谢指教! 解决方案 解决方案二:有个fulltrim函数试下可以不解

LeetCode 26 Remove Duplicates from Sorted Array(从已排序数组中移除重复元素)

翻译 给定一个已排序的数组,删除重复的元素,这样每个元素只出现一次,并且返回新的数组长度. 不允许为另一个数组使用额外的空间,你必须就地以常量空间执行这个操作. 例如, 给定输入数组为 [1,1,2] 你的函数应该返回length = 2, 其前两个元素分别是1和2.它不关心你离开后的新长度. 原文 Given a sorted array, remove the duplicates in place such that each element appear only once and re

JavaScript移除数组元素减少长度的方法_javascript技巧

复制代码 代码如下: //数组移除长度方法 var array=[]; array[0]="张三"; array[1]="李四"; array[2]="王五"; array[3]="赵六"; array[4]="百度"; function remove(array,index){ if(index<=(array.length-1)){ for(var i=index;i<array.lengt

Schema中定义空元素

XSD例子,如下:<xs:element name="Book" type="BookType" nillable="true" /> XML使用时:<Book xsi:nil="true"/>

php计算数组不为空元素个数的方法_php技巧

复制代码 代码如下: <?php $arr = array( 1=>"11", 2=>"22", 3=>"33", 4=>"" ); print_r(count(array_filter($arr))); ?>

CSS的html元素选择器的例子

基本语法: html元素名{ 属性名:属性值; -- } html文件: <html> <head> <title>无标题文档</title> <link rel="stylesheet" type="text/css" href="selector.css" /> </head> <body> html选择器 </body> </html>

HTML实现表单元素对齐的例子

网页里,常见如下的表单代码: <div>   <label for='email'>邮箱地址:</label>   <input name='email' type='text'/> </div> <div>   <label for='password'>密码:</label>   <input name='password' type='text'/> </div> 通常,我们想达到