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 ...
随机推荐
- 【二】Jmeter接口自动化测试系列之函数使用及扩展
上一篇文章我们了解了Jmeter的参数化的集中方法,虽然方法不是很多,但已经足够使用! 本篇文章,介绍一下Jmeter自带函数的使用和 函数扩展,来满足测试工作中的各种需求! Jmeter自带函数 点 ...
- gitlab开机启动|启动 停止 重启
修改配置后的初始化 gitlab-ctl reconfigure 启动 sudo gitlab-ctl start 停止sudo gitlab-ctl stop 重启sudo gitlab-ctl r ...
- Hbase时间同步
如果Hbase的时间没有同步,启动主节点会起来,子节点的regionServer就不会起来. 错误日志如下: aused by: org.apache.hadoop.hbase.ipc.RemoteW ...
- (Struts2学习系列二)Struts2动态方法调用:指定method属性
紧接着上一篇,在HelloWorldAction.java中添加add和update方法: public class HelloWorldAction extends ActionSupport{ p ...
- 微信小程序picker下拉绑定数据
页面部分 <picker mode = "selector" bindchange="bindPickerChange" value="{{pr ...
- uptime - 告知系统运行了多久时间
SYNOPSIS(总览) uptime uptime [-V] DESCRIPTION(描述) uptime 给出下列信息的一行显示. 当前时间, 系统运行了多久时间, 当前登陆的用户有多少, 以及前 ...
- linux 下安装mysql5.7.17
安装前的环境准备 linux 环境准备 内核参数建议值 1.调整最大文件数限制 直接执行 ulimit -n 65535 或写入/etc/sysctl.conf 重启后生效 2.修改IO 调度器设置 ...
- 第一天:powershell外部命令
首先我们应该怎样打开powershell呢?win+R,之后是一个运行窗口,在里面输入“powerhsell".按回车键,就可以打开powershell命令窗口了.当然也有其他方法打开,比如 ...
- SSH连接时,长时间不操作就断开的解觉办法
1.第一次尝试失败 修改/etc/ssh/sshd_config文件, 找到 ClientAliveInterval 0 ClientAliveCountMax 3 并将注释符号("#&qu ...
- [转]走进 LINQ 的世界
序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串> 和 <L ...