集合 表示一组可用于获取和存储的对象,在 C# 中提供了两种类型的集合。

  • 普通集合

  • 泛型集合

前者存在于 System.Collections 命名空间下,属类型不安全的,后者存在于 System.Collections.Generic 命名空间下,属类型安全的。

不可变对象 定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDictionaryIReadOnlyCollection 不可变集合,这篇文章我们就来讨论这些不可变集合以及在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相关推荐

  1. idea中java文件怎么运行_Java入门基础篇-如何在Java中创建只读文件

    本文选自千锋教育<Java语言程序设计>,如需转载请注明出处,谢谢! 1.如何创建只读文件 要使文件只读,我们只要将文件属性更改为只读就行:可以使用File类的setReadOnly()方 ...

  2. java类只读怎么办_如何在Java中制作一个只读类?

    java类只读怎么办 The question is that "can we make a read-only class in Java?" 问题是"我们可以用Jav ...

  3. 如何在unity中制作塔防游戏

       塔防游戏非常流行,毫无疑问--没有什么比看着自己的防御消灭讨厌的侵略者更让人满足!在这两部分教程中,用unity来制作一个塔防游戏! 将会学习怎样...... 创建一波敌人 让它们跟随线路点 ...

  4. mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件

    database - 如何在MySQL中收缩/清除ibdata1文件 我在localhost中使用MySQL作为在R中执行统计的"查询工具",也就是说,每次运行R脚本时,我创建一个 ...

  5. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

  6. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  7. 如何显示服务器上excel,如何在HTML中使用OWC正确显示、加载服务器端的excel文件呢?...

    如何在HTML中使用OWC正确显示.加载服务器端的excel文件呢? 我的服务器端是unix操作系统,应用是java写的 我试了很多方法,都无法将excel在浏览器中以只读的形式显示出来,环境是XP  ...

  8. 【机器学习基础】如何在Python中处理不平衡数据

    特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...

  9. closecmd python_如何在python中禁止控制台/ cmd错误消息

    如何在 python中为chromedriver和pyinstaller exe压缩错误消息? 我注意到当我在pyinstaller中使用chromedriver并运行它时,我得到一个错误消息列表.我 ...

最新文章

  1. 程序员修炼之道:从小工到专家读后感02
  2. 摩根斯坦利面试题库_经验 | 金融公司摩根士丹利从笔试到实习的全程经验
  3. 安卓手机系统可删除的自带软件大集合
  4. php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析
  5. php查真实地址,php教程:检查URL地址是否真实存在
  6. 且用计算机语言怎么表示,用计算机语言表示算法.doc
  7. Java-杂项:Java数组Array和集合List、Set、Map
  8. Jensen不等式及其应用
  9. 读书札记:30个因素预示美国将再现“大萧条”...
  10. 关于MVC控制器导出Excel时MemoryStream流已关闭的问题
  11. Android-skin-support 换肤原理全面解析
  12. 媒体-PR-微商-地摊儿…… 媒体人的转型你到了哪一步?
  13. 天融信上网行为管理如何做短信验证?
  14. 简记_ LDO基础知识
  15. 基于IEC61499 的楼宇自动控制系统
  16. ACM-ICPC 2016 上海赛区ECFINAL A,D
  17. 【C语言】C语言实现中文字符(句号,感叹号,问号)的十进制数值
  18. 深入探索C语言struct的用法
  19. udec采场开挖教程_基于UDEC的采场矿山压力显现数值模拟研究
  20. 中国航空发动机行业发展动态分析与十四五战略规划研究报告2022-2028年版

热门文章

  1. 一个Demo让你掌握Android所有控件
  2. POJ 2798:二进制转换十六进制
  3. Android Listview中Button按钮点击事件冲突解决办法
  4. 带有控制按钮的图片滚动
  5. Process Explorer 15.2:微软增强型任务管理器
  6. C语言程序设计实验最短路径,7最短路径C语言程序设计.pdf
  7. Macbook全系列详细分析及购机指南
  8. Teams Bot开发系列:初识Bot
  9. 谷歌chrome xp_将非Google任务列表添加到Chrome
  10. quantum_如何从Firefox Quantum删除Pocket