2019-10-9-dotnet-不申请额外数组空间合并多个只读数组列表
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
dotnet 不申请额外数组空间合并多个只读数组列表
|
lindexi
|
2019-10-09 15:15:10 +0800
|
2019-10-9 15:8:43 +0800
|
dotnet
|
我在写一个简单的功能,需要将两个不同的数组合并到一起,但是我的功能只是做只读,如果合并的方法需要申请额外的内存空间,将降低性能。本文写了一个简单的方法,通过判断下标的方法做遍历多个数组组合在一起,通过判断当前获取的下标在对应哪个数组下标范围内,返回对应数组的元素
合并多个数组或列表有多个不同的方法,但是我找到的方法都需要额外申请内存空间,需要做一次数组元素复制,相对性能比较差,如果是做只读,功能和 Span 相反,那么可以通过遍历的数组下标判断
下面方法可以在项目用,做法很简单,看代码也就知道
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq; public class CombineReadonlyList<T> : IReadOnlyList<T>
{
public CombineReadonlyList(params IReadOnlyList<T>[] source)
{
Source = source;
} public IReadOnlyList<T>[] Source { get; } public IEnumerator<T> GetEnumerator()
{
return Source.SelectMany(readOnlyList => readOnlyList).GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
} public int Count => Source.Sum(temp => temp.Count); public T this[int index]
{
get
{
var n = index;
var source = Source; foreach (var list in source)
{
if (n < list.Count)
{
return list[n];
} n -= list.Count;
} throw new IndexOutOfRangeException();
}
}
}
这个类如果不算传入的只读列表的原列表的更改,这个类是线程安全的
可能遇到的坑是传入的只读列表的原列表添加了值,也就是 CombineReadonlyList[n] 执行两遍获取的元素可能不相同
更多有趣的数组定义请看 Sakuno.Base.Collections github
如果不需要获取指定下标,那么可以使用 ReadOnlyCollection 请看代码
public class CombineReadonlyCollection<T> : IReadOnlyCollection<T>
{
public CombineReadonlyCollection(params IReadOnlyCollection<T>[] source)
{
Source = source;
} public IReadOnlyCollection<T>[] Source { get; } public IEnumerator<T> GetEnumerator()
{
return Source.SelectMany(readOnlyList => readOnlyList).GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
} public int Count => Source.Sum(temp => temp.Count);
}
2019-10-9-dotnet-不申请额外数组空间合并多个只读数组列表的更多相关文章
- 高效合并两个有序数组(Merge Sorted Array)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...
- MATLAB中多个一维数组的合并
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013538664/article/details/37673711 1.一维数组直接合并 ...
- 【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)
结对信息.具体分工 Github地址:https://github.com/MokouTyan/131700101-031702425 学号 昵称 主要负责内容 博客地址 131700101 莫多 代 ...
- 数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间
数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间 1.题目中要求我们不能使用额外的空间,那么我们能采用在原数组上做文章,这里的重点是如何 ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- 2019.10 搜索引擎最新排名,Elasticsearch遥遥领先
大数据的搜索平台已经成为了众多企业的标配,Elasticsearch.Splunk(商业上市公司).Solr(Apache开源项目)是其中最为优秀和流行的选择.在2019.10 最新搜索引擎排名中,E ...
- TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器
TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器 任务清单 给自己取一个酷酷的id,并选择1-2个喜欢的方向.(只是初步选择,后期可更改) 改下群名片.例如yo ...
- 2019/10/9 CSP-S 模拟测
T1:最大约数和 给定一个正整数 S,现在要求你选出若干个互不相同的正整数,使得它们的和不大于 S,而且每个数的因数(不包括本身)之和最大.S <= 1000 分析: 其实考完才听他们说是背包, ...
- jQuery进阶第四天(2019 10.13)
1 初识面向对象(面向对象是一种思维方式) 以前写的代码 var name = '莉莉'; var sex = '女'; var age = 18; var name1 = '小明'; var sex ...
随机推荐
- 12、testng.xml指定运行测试包、测试类、测试方法
目录如下: TestFixture.java 代码如下: package com.testng.cn; import org.testng.annotations.*; public class Te ...
- 拾遗:Qemu/KVM
WinXP: #!/bin/bash name=winxp qemu-system-x86_64 \ -enable-kvm \ -cpu host -smp ,sockets=,cores=,thr ...
- Rsync 恢复 libselinux.SO.1
libselinux.SO.1 这个文件对 CentOS 7很重要, 误删掉后,会导致很多命令无法使用(比如yum ,rpm 命令),利用rsync这个工具来修复. 服务端执行如下配置:(选取正常 ...
- Redis数据结构之跳跃表-skiplist
在Redis中,zset是一个复合结构: 使用hash来存储value和score的映射关系 使用跳跃表来提供按照score进行排序的功能,同时可以指定score范围来获取value列表 结构 zse ...
- minicom 的使用
1.切换到 root 用户. [root@localhost btools]#su - 2. 查找有效的串设备. [root@localhost ~]#cat /proc/devices ... 4 ...
- (PASS)java中打印当月的日历的每一天
package test; import java.time.DayOfWeek; import java.time.LocalDate; /** * * @ClassName: Calendar ...
- 记一次Mysql占用内存过高的优化过程
一.环境说明: 操作系统:CentOS 6.5 x86_64 数据库:Mysql 5.6.22 服务器:阿里云VPS,32G Mem,0 swap 二.问题情况: 1.某日发现公司线上系统的Mysql ...
- Thymeleaf语法总结
Thymeleaf是Spring boot推荐使用的模板引擎. 一.th属性 html有的属性,Thymeleaf基本都有,而常用的属性大概有七八个.其中th属性执行的优先级从1~8,数字越低优先级越 ...
- dubbo入门之服务消费
今天,我们来看看dubbo消费的执行过程 首先,我们都知道dubbo是一个基于netty实现的RPC框架,底层通信是使用netty来实现的.在学习dubbo的时候,或许我们都会有下面的这些疑惑: 1. ...
- DIV内容超出固定宽度部分用省略号代替
方法一:CSS控制溢出文本 只针对DIV单行数据展示 /** DIV文本超出宽度部分用...替换,鼠标移上显示全部 **/ .textAuto{overflow:hidden;text-overfl ...