; } public ICollection PostTags { get; } = new List(); } public class Tag {...派生自DbContext的上下文类: public class MyContext : DbContext { public DbSet Posts { get; set; }...=> new { t.PostId, t.TagId }); } } 这样就完成了我们的多对多映射了。...我们只是通过多建立了一个表,将两个实体类的Id作为联合主键。 在Identity框架中,如果你细心点,你会发现有个userroles表,这个表是就是用来做Users表和Roles表的映射的。...那么接下来我们只要新建一个实体类,随后在上下文类中映射到表: modelBuilder.Entity.ToTable("userroles"); 这样就可以了。
注意这个类继承自ICollection,而并没有实现IList,所以你不能通过索引器访问链表。使用情况通常是:当有非常多的在头尾进行的插入删除操作,却只有很少的访问操作时。...IEnumerable的派生类:小结 访问方式 继承自 特点 IEnumerable 通过ElementAt 无 所有泛型集合都继承自此接口 有非泛型版本 提供遍历(通过GetEnumerator...返回所有资料然后才进行筛选 可通过sql profiler看到区别 注:还有若干重要的派生类例如Concurrent类型,这些放到多线程同步中。...在遇到数组查重问题时,哈希永远都是一个利器:https://www.zhihu.com/question/31201024 IEnumerable最重要的一个派生类就是IList接口。...它又有两个主要的派生类Array和List。List的内部实现是一个数组而不是链表。LinkedList才是C#的链表实现。LinkedList不实现IList接口。
如何解决冲突 若要解决此规则的冲突,请实现某个泛型集合接口: System.Collections.Generic.IEnumerable System.Collections.Generic.ICollection...示例 以下示例显示从非泛型 CollectionBase 类派生并与此规则产生冲突的类。...将基类更改为已同时实现泛型和非泛型接口的类型(如 Collection 类)。...通过接口实现来解决 以下示例通过实现 IEnumerable、ICollection 和 IList 等泛型接口来解决冲突。...以下示例通过将集合的基类从非泛型 CollectionBase 类更改为泛型 Collection(在 Visual Basic 为 Collection(Of T))类来解决冲突。
中表示集合的行为的接口有: 1)ICollection 定义所有集合的大小、枚举数和同步方法。...派生于IEnumerable 它定义了集合类最基本的行为,所有的集合类都实现了这个接口(基接口) 但是它的行为太过基本:主要就是一个Count属性,单独实现它没有太大意义 2)IEnumerable 公开枚举数...IList实现是可排序且可按照索引访问其成员的值的集合,它本身实现了ICollection和IEnumerable接口 是所有列表的抽象基类。...IDictionary可称为字典、映射或散列表,它根据键(任意类型)来访问值 2.System.Collections中可以直接使用的集合类有: 1)ArrayList 实现了接口:IList、ICollection... Add Insert Remove Item Sort Find List
下面展示了类的定义: // List 泛型类 // IList 泛型接口 // T:类型参数,在定义泛型类的时候不设定,在使用泛型类的时候指定具体类型,如int,string等 public...class List : IList, ICollection, IEnumerable, IEnumerable, IList, ICollection { public...使用泛型类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象从泛型类型派生自的那个类型派生。...例如,由于List从Object派生,所以List和List也从Object派生。指定类型实参不影响继承层次结构。...相当于向编译器承诺:一个指定的类型实参要么是约束类型相同的类型,要么是从约束类型派生的类型。
where T:new() :表示这个泛型具有一个无参数的构造方法,如果有多个约束,new()必须放在最后 where T:基类名 :表示这个泛型是该基类或者其派生类 where T:接口名 :表示泛型是为了实现该接口的类型...where T:U :为T提供的类型参数必须是为U提供的参数或派生自为U提供的参数。...实现了ICollection和IList和IEnumerable接口 灵活的设置数组大小 不安全的集合类型 其元素为值类型时,效率不高(装箱和拆箱耗性能) ArrayList常用方法与描述 List...泛型动态数组 List类是ArrayList类的泛型等效类 同样实现了IList接口,IEnumrator接口和ICollection 与ArrayList不同的是,声明集合时需要声明集合内部的数据类型...,即T的类型 安全的集合类型 某种情况时,在处理值类型时其处理速度比ArrayList快得多 LIst常用方法与描述 常见集合和列表实现接口 练习 利用ArrayList或者是List做一个小型的学生管理系统
IEnumerable,其可以获取一个IEnumerator迭代器,如果从数据库的角度来看,前者是表,后者是游标,同时这两个接口是唯一具有可变性的集合接口。...ICollection,它扩展了IEnumerable,添加了Count和IsReadOnly属性,Add和Remove等操作方法,Contains等判定函数,所有的标准泛型集合都实现了该接口...List,其是列表的默认选择,内含一个数组,并且提供列表的逻辑大小Count和后台数组的大小Capacity,当数组满了时,会进行扩容。...数组,最基础的集合,均派生自System.Array,包括一维数组T[10],二维数组T[10, 20]等,通过Array类的静态方法进行ConvertAll、FindAll和BinarySearch等操作...Stack,其实现更简单,可以看做是一个提供Push、Pop、Peek操作的List。 最后介绍并行集合,也就是线程安全的集合。
List SelectAll() { //more code } //more code } 前面这段代码我们定义了操作数据库的泛型类,这个类可以被项目中所有需要操作数据库的类使用...我们先来看一下代码: public interface IDemo { ICollection items {get;set;} } public class Demo:IDemo...在这里我通过简单的几句来说一下约束继承。首先无论是泛型类型参数还是它们的约束都不会被 派生类 继承,这是因为泛型类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被从其派生的泛型类所继承。...首先无论是泛型类型参数还是它们的约束都不会被 派生类 继承,这是因为泛型类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被从其派生的泛型类所继承。...由于派生的泛型类类型参数时泛型基类的类型实参,所以类型参数必须具有等同于或者强于泛型基类的约束条件。 Tip 2:泛型方法同样也可以使用约束,约束条件和泛型类类似。
(注意非泛型版本的ICollection并没有Add,Remove等方法)但在实际情况中,我们通常使用ICollection的继承类而不是ICollection本身(不能初始化一个接口)。...ICollection的继承类有Stack,Queue,IDictionary和IList。 IList本身实现了索引器。...ArrayList是C#最不常用(我想不出任何用它的理由)也是最基础的一个动态数组。 通常我们在说ArrayList时,总是和List和普通的数组(无法扩容)进行比较。...ArrayList派生自IList,所以其是一个非泛型的集合。IList继承ICollection,同时,其增加了Add,Remove等方法。可以修改集合的内容。...IEnumerable的派生类:小结 访问特定位置的成员方式 继承自 特点 IEnumerable 通过ElementAt 无 有泛型版本 提供遍历(通过GetEnumerator) 不能实例化(
俗话说知其然,知其所以然,平常看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的集合类?...和ICollection 从最上面第一张图我们可以知道,ICollection是直接继承自IEnumerable。...ICollection 与ICollection 略有不同,ICollection不提供编辑集合的功能,即Add和Remove。包括检查元素是否存在Contains也不支持。...List LinkedList HashSet SortedSet Stack Queue List 泛型的List 类提供了不限制长度的集合类型,List...现在基本上我们已经不使用这些集合类了,除非在做一些和老代码保持兼容的工作的时候。来看看1.0时代的.NET程序员们都有哪些集合类可以用。 ArraryList 后来被List替代。
规则说明 按照约定,扩展某些基类型或实现某些接口的类型的名称,或者由这些类型派生的类型的名称应具有与相应基类型或接口关联的后缀。 命名约定为面向公共语言运行时的库提供通用外观。...这些集合通过 System.Data.InternalDataCollectionBase 基类实现 ICollection。 如何解决冲突 重命名该类型,使其带有正确的字词后缀。...对于其他后缀,请勿禁止显示此规则发出的警告。 通过后缀能够从类型名称中看出预期用途。 配置代码以进行分析 使用下面的选项来配置代码库的哪些部分要运行此规则。..., internal 排除间接基类型 可以配置是否从规则中排除间接基类型。...可用以下任意一种格式指定类型: 仅类型名称(包括具有相应名称的所有类型,不考虑包含的类型或命名空间) 完全限定的名称,使用符号的文档 ID 格式,前缀为 T:(可选)。
) { ICollection src = orgSequence as ICollection; orgSequence...= new List(src.Count); } else { orgSequence = new List();...但是当 T 是 string 时性能就会大打折扣,因为我们的代码本身并没有实现 IList ,因此我们需要在泛型类中编写更具体的代码才能解决这个问题,我们需要在 DemoEnumerable 类中加入如下的嵌套类...) { ICollection src = orgSequence as ICollection; orgSequence...= new List(src.Count); } else { orgSequence = new List();
这样即使多个线程来访问它,它也不会产生对线程来说很意外的数据。 C#中的Dictionary不是线程安全的,我在下面这个例子中,把一个Dictionary对象作为了全局的static变量。...所以我需要包装一下.net自带的Dictionrary. 发生冲突的部分无非是写的地方,所以在离写Dictionary最近的地方加一个锁。其他的外层代码可以自带的Dictionary相同了。...我们看Dictionary的实现接口, 自定义一个线程安全的数据对象类。...).aspx http://www.cnblogs.com/atskyline/p/3234805.html 4.0中新增的线程安全集合类: 线程安全集合类 非线程安全集合类 ConcurrentQueue... Queue ConcurrentStack Stack ConcurrentBag List ConcurrentDictionary Dictionary
GetMetadata() where T: class; public IReadOnlyList GetOrderedMetadata() where T: class...路由系统利用EndpointBuilder来构建表示终结点的Endpoint对象。如下面的代码片段所示,EndpointBuilder是一个抽象类,针对终结点的构建体现在抽象的Build方法中。...如下面的代码片段所示,派生于Endpoint的RouteEndpoint类型有一个名为RoutePattern的只读属性,返回的正是表示路由模式的RoutePattern对象。...如下面的代码片段所示,RouteEndpoint Builder类型派生于抽象基类EndpointBuilder。...从给出的代码片段可以看出,ModelEndpointDataSource的GetChangeToken方法返回的依然是一个不具有感知能力的NullChangeToken对象。
本文主要学习记录以下内容: 建议23、避免将List作为自定义集合类的基类 建议24、迭代器应该是只读的 建议25、谨慎集合属性的可写操作 建议23、避免将List作为自定义集合类的基类... 如果要实现一个自定义的集合类,最好不要以List作为基类,而应该扩展相应的泛型接口,通常是Ienumerable和ICollection(或ICollection的子接口,如...> 不过,遗憾的是继承List并没有带来任何继承上的优势,反而丧失了面向接口编程带来的灵活性,而且可能不稍加注意,隐含的Bug就会接踵而至。...线程t2也许是另一个程序猿写的,但他看到的只有list,结果,针对list的修改会直接影响到另一个工作线程中的对象。...在例子中,我们将list赋值为null,模拟在StudentTeamA(或者说工作线程t1)不知情的情况下使得集合属性变为null。
各集合类底层接口关系图 泛型与非泛型集合类的分析 泛型集合是类型安全的,基于固定的泛型T,运行时不需要像非泛型的执行Object和具体类型的类型转换。 泛型集合的效率相对较高。...- ICollection和ICollection 从最上面第一张图我们可以知道,ICollection是直接继承自IEnumerable。...此外,它还实现了非泛型的ICollection和IList接口,并在必要时进行装箱和拆箱,以及进行执行时类型检查,以保证新元素始终与T兼容。...从List中移除元素需要复制所有的后续元素,因此其复杂度为O(n – k),其中k为移除元素的索引。从列表尾部移除要比从头部移除廉价得多。...KeyedCollection为抽象类;派生类将实现GetKeyForItem方法,可以从列表中的任意项中提取键。在我们这个客户的示例中,GetKeyForItem方法返回给定客户的ID。
灵感 最近在做配置模块,然后整个配置的参数是非常多的,层级结构也很深。...可能有几百个参数,三、四层的层级关系,想要捋顺所有的类和参数,太繁琐了,而且 Visual Studio 的类视图只能看到属性,却看不出层级关系来,所以花费些许精力,写一个控制台小程序,展示类结构。...原理就是通过反射得到所有属性,遍历展示,有层级关系的递归展示。...)) { arr[0] = "List<"; arr[1] =... else if (typeDefinition == typeof(ICollection)) {
,按约定使用Model名+Configuration作为fluent api的类的名字,并需要继承EntityBaseConfiguration这个类,这个类对EntityBase的几个属性进行了映射配置...不同的是,它需要继承的是TreeEntityBase这个基类,TreeEntityBase的代码如下: using System.Collections.Generic; using LegacyApplication.Shared.Features.Base...该Model的fluent api配置类需要继承的是TreeEntityBaseConfiguration这个类,代码如下: using System.Collections.Generic; using...(也就是LegacyApplication.Models这个项目)里面所有的fluent api配置类(EntityTypeConfiguration的派生类)全部加载进来。...这里说一下CoreContext,由于它派生与DbContext,而DbContext本身就实现了Unit of Work 模式,所以我做Unit of work模式的时候,就不考虑重新建立一个新类作为
,有索引器,查询元素位置,插入数据,移除索引位置数据这个方法,简单的可以当作存放数据的容器,不能像List那样具有很多数据处理的方法。...System.Collections.IList // 集合的父基类,定义了返回元素数量,复制等一些集合类型最基本的方法,同时提供了可以同步访问ICollection对象元素的方法,数组具有这些能力 System.Collections.ICollection...// 也提供了索引器,删除插入查询数据几个方法,但是是泛型数据 /* 特殊的,所有的数组默认继承自Array抽象类,该类实现了如上的接口,但在查看源码不能看到数组实现如下接口,这些接口实在CLR动态为一维数组实现如下的接口...*/ System.Collections.Generic.IList // 提供泛型的能力,也有基本的增删改查的功能 System.Collections.Generic.ICollection...System.Collections.Generic.IEnumerable // 只读list,通过索引访问该只读list的元素 System.Collections.Generic.IReadOnlyList
本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...,包含多种方法的List接口。...1: System.Collections.Generic.IList strIList = new List(); 我们一起了解一下具体的类和接口之间的区别。...,当从服务器端加载过量的数据,IQueryable会自动减少应用负载。...ICollection 继承了IEnumberable,但是IEnumberable是基于索引的,ICollection不基于索引。 ?
领取专属 10元无门槛券
手把手带您无忧上云