注意C#没有List,只有IList,IListT>和ListT>。其中第三个继承第二个。第一个是第二个的非泛型版本。ArrayList则继承第一个。...T>) 查找:O(N) 关于链表的算法面试题可谓五花八门,实现一个单向或双向链表,并实现它们的若干主要功能,是一个极好的编程练习。...IEnumerableT>替代作为返回类型 IQueryableT> 通过IndexOf IEnumerableT> 从远端获得筛选之后的资料,和IEnumerableT>不同,IQueryable...它又有两个主要的派生类Array和ListT>。ListT>的内部实现是一个数组而不是链表。LinkedListT>才是C#的链表实现。LinkedListT>不实现IListT>接口。...当集合元素未知,且经常存在插入或删除的动作时,考虑使用LinkedListT>取代ListT>。
本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...Collection(集合) Collection是数据记录集合, 编写代码过程中,常常需要合适的容器保存临时数据,方便修改和查找,如何选取合适的数据容器,关键在于将执行的数据操作以及数据记录是否大量。...具体类可继承其他类,并实现一个或多个接口。 2. 在内部类中可以定义变量并赋值,接口中不允许此操作。 3. 具体类可包含构造函数,而接口中不能定义构造函数 4....)数据,使用IEnumberable 会从服务器端将所有数据拷贝到客户端,并进行一定的过滤,如果服务器端有大量数据会造成内存负载超重。...IQueryable可保证大数据量时应用程序的高性能。 IQueryable会先过滤数据,然后发送给客户端。 ?
where T : class 是对T的限制,这里的意思是T必须是引用类型,包括任何类、接口、委托或数组类型) /// /// <typeparam name=".../// Gets a table /// IQueryableT> Table { get; } /// ...T> GetAllEntityWhere(ExpressionT, bool>> where) { IQueryableT> query = this.Entities.Where...T> GetPageEntities(int pageIndex, int PageSize) { IListT> List = this.Entities.Skip...// throw new NotImplementedException(); IListT> List = this.Entities.Where(where).Skip(pageIndex
可查询类型 LINQ之所以能够使用相同的语法操作不同的数据源,是因为和LINQ直接打交道的是可查询类型而非数据源,在LINQ中,直接或间接实现了IEnumerableT>接口的类型称为可查询类型, ....IQueryableT>继承自IEnumerableT>,是个标记接口。...两个接口 在LINQ中,一个查询表达式被编译为表达式树或者委托,查询结果为IEnumerableT>类型则被编译为委托,查询结果是IQueryable或IQueryableT>类型则被编译为表达式树...System.Linq.IQueryableT> 在执行查询操作时,IQueryable先在服务器端进行过滤操作(如果有的话),然后再将数据放到本地内存中。...(C#) LINQ provider basics Enabling a Data Source for LINQ Querying LINQ: Building an IQueryable Provider
不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行。 正文# ### 1.元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变。...如果一定要动态改变数组的长度,一种方法是将数组转换为ArrayList或List<T>,需要扩容时,内部数组将自动翻倍扩容 还有一种方法是用数组的复制功能。...FCL集合类应该以组合的形式包含至自定义的集合类,需扩展的泛型接口通常是IEnumer-able<T>和ICollection<T>(或ICollection<T>的子接口,如IList<T>),前者规范了集合类的迭代功能...那么,到底什么时候使用IQueryable<T>,什么时候使用IEnumerable<T>呢?简单表述就是:本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>。...注意 在使用IQueryable<T>和IEnumerable<T>的时候还需要注意一点,IEnumerable<T>查询的逻辑可以直接用我们自己所定义的方法,而IQueryable<T>则不能使用自定义的方法
如果将任意部分声明为抽象的,则整个类型都被视为抽象的。如果将任意部分声明为密封的,则整个类型都被视为密封的。如果任意部分声明基类型,则整个类型都将继承该类。...各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。最终类型是所有部分在编译时的组合。...name="whereLambda"> /// IQueryableT> GetList(FuncT, bool...T> GetList() { return db.SetT>(); } public virtual IQueryable将覆盖对此文件的手动更改。
T> ReWriteT>(this IQueryableT> qu) { var result = new InterpolationStringReplacerT>().Visit(qu.Expression...qu.Provider.CreateQuery(result) that has the IQueryable method in IQueryableT>....It is widely used for C# (look at IEnumerableT> interface!)...请注意转换在IQueryable T>中具有IQueryable方法的qu.Provider.CreateQuery(result) 。 它广泛用于C#(请看IEnumerable T>接口!)...我们可以通过将T引入基类(通过协方差)来避免这种情况,但是它对接口方法设置了一些限制。
-allInOne: (可选) 只有当-dir被设置时:将所有图表的输出复制到文件include.puml(这允许PlanUMLServer渲染)。...C# class ClassA{ public IList Strings{get;} = new List(); public Type1 Prop1{...`1"T> { } ClassA o-> "Strings" "IList`1" ClassA --> "Prop1" Type1 ClassA --> "field1" Type2...具有此属性的属性(或字段)被描述为类的成员,没有任何关联。...+ ClassB(users:IList) } class "IList`1"T> { } ClassA --> "DefaultUser" User ClassA --> "Users
但是天无绝人之路,在 c#中拥有扩展方法、表达式目录树和反射,可以将上面的方式进行优化。... /// public static IOrderedQueryableT> OrderByT>(this IQueryable...(propertyName)); } public static IQueryableT> WhereT>(this IQueryableT> source, string propertyName...public static IQueryableT> WhereListT>(this IQueryableT> source, string propertyName, ListT>, IQueryableT>> UseCoditionFindT>(this IQueryableT> source, CoditionEntity coditionEntity)
他的目标是解决C#面向对象世界与数据库关系世界之间的"阻抗失配"。最终诞生的LINQ与其说是发明,不如说是数十年函数式编程与数据库理论的完美融合,让数百万C#开发者得以受益。 2....IQueryable不存储数据,它存储的是"配方" 这可能是最关键也最容易被误解的概念。当你针对数据库编写LINQ查询时,通常操作的是IQueryable。...许多开发者将其视为内存中的IEnumerable,但二者有本质区别: • IEnumerable是数据流,你可以遍历它 • IQueryable是表达式树,它是查询的"配方"或蓝图 当你对IQueryable...这就是为什么在IQueryable查询中使用本地C#方法会失败——SQL转换器根本不知道你的C#方法要做什么。...T>(this IEnumerableT> source, int size) { T[] bucket = null; var count = ;
Load(T entity); #endregion #region 将数据持久化到数据库 /// /// 插入实体.../// 集合 //IQueryableT> LoadAll(); /// /// 分页获取所有集合...T> getBywhereSql(string wheresql) //{ // IListT> list = this.HibernateTemplate.Find...getBySql(string sql) //{ // IListT> list = this.HibernateTemplate.FindT>(sql);...例getByCondition("Name","11"); IListT> list = this.HibernateTemplate.FindT>("from " + TEntityName
LINQ to SQL可以将查询表达式转换为SQL语句,然后在数据库中执行。相比LINQ to Object,则是将查询表达式直接转化为Enumerable的一系列方法,最终在C#内部执行。...将查询表达式转换为SQL语句并不保证一定可以成功。 IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。...它令IQueryable和IEnumerable一样,拥有强大的查询能力。 AsQueryable方法将IEnumerableT>转换为IQueryableT>。...大家可以使用EF或其他方式。...但是IQueryable的优势是它有表达式树,所有对于IQueryableT>的过滤,排序等操作,都会先缓存到表达式树中,只有当真正发生遍历的时候,才会将表达式树由IQueryProvider执行获取数据操作
C#异常类返回哪些信息? 10. 如何创建一个自定义异常? IList 接口与List的区别是什么? IList 泛型接口是 Icollection 接口的子代,并且是所有非泛型列表的基接口。...Ilist 实现有三种类别:只读、固定大小、可变大小。无法修改只读 Ilist。固定大小的 Ilist 不允许添加或移除元素,但允许修改现有元素。可变大小的 Ilist 允许添加、移除和修改元素。...而 IList IList11 =new List (); 只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。所以它只是希望使用到IList接口规定的功能而已。...次要约束与主要约束的语法基本一致,区别仅在于提供的不是一个引用类型而是一个或多个接口。...C#异常类返回哪些信息? C#中,所有异常都继承自System.Exception类,Exception类定义了C#异常应该具有的信息和方法。
ICollection的继承类有Stack,Queue,IDictionary和IList。 IList本身实现了索引器。...和顺序储存相比,哈希表查找速度快,而顺序储存理论上最快的速度是O(log(n))或O(n)。当数据不连续时,哈希表还能节省空间(相比大数组)。...ArrayList是C#最不常用(我想不出任何用它的理由)也是最基础的一个动态数组。 通常我们在说ArrayList时,总是和ListT>和普通的数组(无法扩容)进行比较。...ArrayList派生自IList,所以其是一个非泛型的集合。IList继承ICollection,同时,其增加了Add,Remove等方法。可以修改集合的内容。...方法 ArrayList 索引器 IList dynamic sized,大小倍增 弱类型(所有的成员被视作object) 对应的泛型版本为ListT> 不使用 HashTable 键值对 IDictionary
Linq 只是辅助我们快速查询的语言,并不是.NET或者C#的一部分,在任何.NET平台上的语言中都可以使用。...IQueryableT>并非IEnumerableT>对象,无法实时的做出处理然后将结果返回给下一个方法接着执行。那么它如何将片段性的执行方法串成一个整的、完整的查询?...这幅图重点是IQueryableT>对象的连续操作,大致原理是每次执行扩展方法的时候都会构造一个新的IQueryableT>,本次的IQueryableT>对象将包含上次执行的表达式树,以此类推就形成了一颗庞大的表达式树...这是问题的重点,对扩展方法、链式编程不熟悉的朋友很难将source能串联到之前方法所返回的IQueryableT>对象上。...3.3】.分段执行IQueryableT>中的子方法(Queryable中的扩展方法) 都知道Linq的查询是将一些关键字拼接起来的,行成连续的查询语义,这其中背后的原理文章上上下下也说过很多遍,我想也应该大致的了解了
(3).C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。 (4).C#编译要求“导入”扩展方法。...Enumerable大多数扩展是IEnumerableT>,Queryable大多数扩展是IQueryableT>。 ...{ /// /// 获取与 T:System.Linq.IQueryable"/> 的实例关联的表达式目录树。.../// /// /// /// 与 T:System.Linq.IQueryable"/> 的此实例关联的 Expression Expression { get; } /// /// 获取在执行与 T:System.Linq.IQueryable
查询在 foreach 语句中执行,且 foreach 需要 IEnumerable 或 IEnumerableT>。...支持 IEnumerableT> 或派生接口(如泛型 IQueryableT>)的类型称为可查询类型。 可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。...下例中,Customers 表示数据库中的特定表,而查询结果的类型 IQueryableT> 派生自 IEnumerableT>。...但基本规则很简单:LINQ 数据源是支持泛型 IEnumerableT> 接口或从中继承的接口的任意对象。...但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。...在 C# 中可为以下对象编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerableT> 接口的任何对象集合...查询表达式易于掌握,因为使用了许多熟悉的 C# 语言构造。 查询表达式中的变量全都是强类型,尽管在许多情况下,无需显式提供类型,因为编译器可以推断出。...有关详细信息,请参阅 C# 语言规范和标准查询运算符概述。 通常,我们建议在编写 LINQ 查询时尽量使用查询语法,并在必要时尽可能使用方法语法。 这两种不同的形式在语义或性能上毫无差异。...查询表达式可被编译成表达式树或委托,具体视应用查询的类型而定。IEnumerableT> 查询编译为委托。 IQueryable 和 IQueryableT> 查询编译为表达式树。
IList 接口与 List 的区别是什么?IList 接口和 List 类是C#中集合的两个相关但不同的概念。...下面是它们的主要区别:IList 接口IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。...public class ListT> : IListT>, ICollectionT>, IEnumerableT>, IEnumerable{ // 具体的实现}总结区别:IList 是一个接口...序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。主要作用包括1、对象持久化允许将对象的状态保存到磁盘或数据库中,以便在程序重新启动后能够恢复对象的状态。...在C#中,委托(Delegate)是一种类型,它代表对一个或多个方法的引用。委托可以用来定义方法的签名,以及在运行时将方法绑定到委托实例。
你可以将 IEnumerable 的实例分配给 IEnumerable 类型的变量。 Contravariance 使你能够使用比原始指定的类型更泛型(派生程度更小)的类型。...你可以将 Action 的实例分配给 Action 类型的变量。 Invariance 表示只能使用最初指定的类型。 固定泛型类型参数既不是协变,也不是逆变。...你无法将 List 的实例分配给 List 类型的变量,反之亦然。 以上来自于官方文档对协变、逆变、不变性的解释 为啥C#需要协变和逆变?...,在这里就是在泛型体系中支持 在C#中,目前只有泛型接口和泛型委托可以支持协变和逆变, 协变(Covariance) 内置的泛型协变接口,IEnumeratorT>、IQuerableT>、IGrouping...T> GetEnumerator(); } public interface IQueryableT> : IEnumerableT>, IEnumerable, IQueryable