如何在 C# 中使用只读的 Collections
集合
表示一组可用于获取和存储的对象,在 C# 中提供了两种类型的集合。
普通集合
泛型集合
前者存在于 System.Collections
命名空间下,属类型不安全的,后者存在于 System.Collections.Generic
命名空间下,属类型安全的。
不可变对象
定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大 IReadOnlyList
,IReadOnlyDictionary
和 IReadOnlyCollection
不可变集合,这篇文章我们就来讨论这些不可变集合以及在C#中如何使用。
三大只读类型介绍
IReadOnlyCollection 表示一个只读集合的基础接口,它实现了 IEnumerable 接口,代码定义如下:
public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable{int Count { get; }}
IReadOnlyDictionary 表示一个字典的只读形态,它实现了基础的只读集合接口 IReadOnlyCollection
, 下面的代码展示了如何将 泛型字典
只读化。
public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string>{{ "1", "ABC" },{ "2", "XYZ" },{ "3", "PQR" },};
IReadOnlyList 表示一个列表的只读形态,值得注意的是 只读集合
只能通过 index 访问,如下代码所示:
[DefaultMember("Item")]public interface IReadOnlyList<out T> : IEnumerable<T>, IEnumerable, IReadOnlyCollection<T>{T this[int index] { get; }}
使用 IReadOnlyList 替换 List
接下来我们看一下如何使用 IReadOnlyList 替换 List 来实现列表的只读化,考虑下面的类。
public class Author
{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }
}
假如你想从数据库中返回 author 集合,使用如下代码:
public static List<Author> GetAuthors()
{return new List<Author>{new Author{Id = 1,FirstName = "Joydip",LastName = "Kanjilal"},new Author{Id = 2,FirstName = "Steve",LastName = "Smith"}};
}
为了简化,我省略了对数据库繁琐的操作,下面的代码展示了如何在 Main 方法中调用 GetAuthors()
方法。
static void Main(string[] args)
{var authors = GetAuthors();Console.Read();
}
显而易见上面的这种 authors 集合是我们用的最多的可变集合,那现在的问题是如何阻止 authors 被修改呢?这里就可以使用 IReadOnlyList
来确保 GetAuthors()
方法返回的集合不可更变,做法就是将方法的返回值从 List<Author>
修改为 IReadOnlyList<Author>
,如下代码所示。
public static IReadOnlyList<Author> GetAuthors()
{return new List<Author>{new Author{Id = 1,FirstName = "Joydip",LastName = "Kanjilal"},new Author{Id = 2,FirstName = "Steve",LastName = "Smith"}};
}
接下来看一下 Main 下的 authors 是否有可添加的 Add()
方法?如下图所示:
使用 IEnumberable 接口
不知道大家可否发现,现存的只读接口都继承了 IEnumberable
,这就意味着 IEnumberable
也是一种只读形态,如果你只需要对集合进行迭代,那么就可以使用 IEnumberable
接口啦,如下代码所示:
public void MyMethod(IEnumerable<Author> authors)
{foreach (Author author in authors){//Write your code here}
}
如果需求不满足,可以对 IEnumerable 继续向下转型,比如想对集合进行索引访问,那么可以转成 IReadOnlyList 接口,尽量满足 可用功能的最小化
,改造后的代码如下:
public void MyMethod(IReadOnlyList<Author> authors)
{int count = authors.Count;for(int index = 0; index < count; index++){var author = authors[index];//Write your code here}
}
IEnumerable
是 .NET 较早版本可用于只读集合形态的接口, 在 .NET Core 中提供了新的只读接口可用于阻止集合的修改,不过值得注意的是,这些对数据提供只读视图的接口,本质上来说也仅仅是高层的封装而已。
译文链接:https://www.infoworld.com/article/3610473/how-to-work-with-read-only-collections-in-csharp.html
如何在 C# 中使用只读的 Collections相关推荐
- idea中java文件怎么运行_Java入门基础篇-如何在Java中创建只读文件
本文选自千锋教育<Java语言程序设计>,如需转载请注明出处,谢谢! 1.如何创建只读文件 要使文件只读,我们只要将文件属性更改为只读就行:可以使用File类的setReadOnly()方 ...
- java类只读怎么办_如何在Java中制作一个只读类?
java类只读怎么办 The question is that "can we make a read-only class in Java?" 问题是"我们可以用Jav ...
- 如何在unity中制作塔防游戏
塔防游戏非常流行,毫无疑问--没有什么比看着自己的防御消灭讨厌的侵略者更让人满足!在这两部分教程中,用unity来制作一个塔防游戏! 将会学习怎样...... 创建一波敌人 让它们跟随线路点 ...
- mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件
database - 如何在MySQL中收缩/清除ibdata1文件 我在localhost中使用MySQL作为在R中执行统计的"查询工具",也就是说,每次运行R脚本时,我创建一个 ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
- 如何显示服务器上excel,如何在HTML中使用OWC正确显示、加载服务器端的excel文件呢?...
如何在HTML中使用OWC正确显示.加载服务器端的excel文件呢? 我的服务器端是unix操作系统,应用是java写的 我试了很多方法,都无法将excel在浏览器中以只读的形式显示出来,环境是XP ...
- 【机器学习基础】如何在Python中处理不平衡数据
特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...
- closecmd python_如何在python中禁止控制台/ cmd错误消息
如何在 python中为chromedriver和pyinstaller exe压缩错误消息? 我注意到当我在pyinstaller中使用chromedriver并运行它时,我得到一个错误消息列表.我 ...
最新文章
- 程序员修炼之道:从小工到专家读后感02
- 摩根斯坦利面试题库_经验 | 金融公司摩根士丹利从笔试到实习的全程经验
- 安卓手机系统可删除的自带软件大集合
- php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析
- php查真实地址,php教程:检查URL地址是否真实存在
- 且用计算机语言怎么表示,用计算机语言表示算法.doc
- Java-杂项:Java数组Array和集合List、Set、Map
- Jensen不等式及其应用
- 读书札记:30个因素预示美国将再现“大萧条”...
- 关于MVC控制器导出Excel时MemoryStream流已关闭的问题
- Android-skin-support 换肤原理全面解析
- 媒体-PR-微商-地摊儿…… 媒体人的转型你到了哪一步?
- 天融信上网行为管理如何做短信验证?
- 简记_ LDO基础知识
- 基于IEC61499 的楼宇自动控制系统
- ACM-ICPC 2016 上海赛区ECFINAL A,D
- 【C语言】C语言实现中文字符(句号,感叹号,问号)的十进制数值
- 深入探索C语言struct的用法
- udec采场开挖教程_基于UDEC的采场矿山压力显现数值模拟研究
- 中国航空发动机行业发展动态分析与十四五战略规划研究报告2022-2028年版