上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List类型,然而该方法需要处理的真实数据则是确定的List。...这个问题让我爆了一会儿,最后在MSDN上找到了一个OfTypeT>的拓展方法可以完成这件事。...internal class Program { private static void Main(string[] args) { List... currencyListCast = new List() { "a", "b", "c"...}; //=>OfType如果元素存在转换不了,也不会出现异常;只转换成功的元素;如果转换不了currencies则为空的List,而不是NULL List
C# 2.0 确实是不支持的,但因为有了这样的需求,微软便适应地做出了改进,在 C# 4.0 中引入了泛型的协变性和逆变性 协变性 协变性指的是泛型类型参数可以从一个派生类隐式地转换为基类 C# 4.0...引入out关键字来标注泛型参数,以示支持协变性,为了更好的说明,下面使用 .Net 类库中的public interface IEnumerableT>接口为例,做泛型协变性的演示: class...(listObject); // 失败 } } 协变性很好理解,派生类可以隐式转换为基类,反之则失败 逆变性 逆变性是指泛型类型参数可以从一个基类隐式地转换为派生类,C# 4.0 引入in关键字来标记泛型参数...由于IComparerT>接口泛型参数只支持逆变,不支持协变,所以不能把IComparer类型隐式地转换为IComparer,所以会出现编译错误 协变和逆变的注意事项...协变和逆变只适用于引用类型,值类型不支持协变和逆变(因为可变性存在引用转换的过程,而值类型变量存储的就是对象本身,并不是对象的应用),所以List无法转换为IEnumerable<object
sr2t是一款针对安全扫描报告的格式转换工具,全称为「Scanning reports to tabular」,该工具可以获取扫描工具的输出文件,并将文件数据转换为表格格式,例如CSV、XLSX或文本表格等...功能介绍 当前版本的sr2t支持处理下列工具生成的安全扫描报告: 1、Nmap (XML); 2、Nessus (XML); 3、Nikto (XML); 4、Dirble (XML); 5、Testssl...接下来,广大研究人员可以直接使用pip命令下载并安装sr2t: pip install --user sr2t 或者使用下列命令将该项目源码直接克隆至本地: git clone https://gitlab.com.../0bs1d1an/sr2t.git 工具使用 我们可以通过一下两种方式来使用sr2t,如果我们以代码包的形式安装sr2t,则可以直接调用安装脚本: sr2t --help 或者从项目目录调用工具脚本...: python -m src.sr2t --help 工具帮助信息 $ sr2t --help usage: sr2t [-h] [--nessus NESSUS [NESSUS ...]]
大家可以这样记忆: 协变性即和谐(与"协"同音)的变化, 从派生类转换为基类, 就如同所子女长的像父母一样, 听起来非常和谐. 这样就很容易记住协变了....因为其泛型参数有out关键字标识, 所以IEnumerableT>泛型的类型参数T支持协变性, 则可将List转化为IEnumerable(这是被继承的协变性支持的....因为ListT>实现了IEnumerableT>接口)....又因为类型参数支持协变性, 所以可以进一步把IEnumerable转化为IEnumerable 2.2逆变性 逆变性指的是泛型类型参数可以从一个基类隐式地转化为派生类,C...10 // 所以 IEnumerableT>泛型类型参数T支持协变性,所以可以 11 // 将List转化为IEnumerable(这个是继承的协变性支持的
所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis) 可以被使用为一个常量,并且期望在未来也是保持不变的 immutable对象可以很自然地用作常量,因为它们天生就是不可变的对于immutable对象的运用来说,它是一个很好的防御编程...unitPrice: 2.5m, discount: 0.0f); OrderLine discountedAppled = apple.WithDiscount(.3f); 现在让我们看看我们如何落实订单的不变性...因为它是一个集合,它可以容易地通过简单地将它替换 ImmutableList T>转换: class Order { public Order(IEnumerable...this : new Order(value); } } 这种设计有一些有趣的属性: • 该构造函数接受 IEnumerable T>,允许传递任何集合中。...• 我们使用 ToImmutableList() 扩展方法,将转换为 ImmutableList 。如果该实例已经是不可变的列表,它会简单地转换而不是创建一个新的集合。
SetException(IEnumerable) 将基础 Task 转换为 Faulted 状态,并对其绑定一些异常对象。...TrySetException(IEnumerable) 尝试将基础 Task 转换为 Faulted 状态,并对其绑定一些异常对象。...但是都是从外部传递的,这里来实现无需 CancellationToken 就能取消任务。...static IEnumerable ForAsync() { int i = 0; while (i list.Length...T> ,而不需要你先实现 IEnumerableT> 。
当然,将实现类Test隐式转换为IEnumerableT>接口,再调用接口的Where方法也能达到同样的效果。...ToDictionary ToDictionary操作符根据指定的键选择器函数,从IEnumerableT>创建一个Dictionary。...ToList ToList操作符可以在IEnumerableT> 类型的任何派生对象上调用,返回值为ListT>类型的对象。 7....ListT>,并且元素数量大于0,则返回首个元素 如果序列没有成功转换为ListT>,则尝试获取序列的遍历器,然后再调用遍历器的MoveNext方法,如果返回值为true,则返回当前的元素。...,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型。
从理论上讲,LINQ只不过是语法糖,而得到的IL代码应该与.NET 2.0中的代码相同. 如何在不使用.NET 3.5库的情况下编写LINQ?它会在.NET 2.0上运行吗?...IEnumerablet> : yesIQueryablet> : yesLINQ to XML : has been working in the trunk, but due to further...见这个问题从VS2008靶向NET 2.0左右时,可用的.Net 3.5功能,自动或毫不费力....LINQ使用合成转换将查询转换为可执行代码.基本上,它将采用这样的代码: ? dim q = from x in xs where x > 2 select x*4; 并将其转换为如下代码: ?...public function Select(of T, R)(source as IEnumerable(of T), transform as Func(of T, R))
它令IQueryable和IEnumerable一样,拥有强大的查询能力。 AsQueryable方法将IEnumerableT>转换为IQueryableT>。...最后,我们选出新纪录并存在List中,这样我们的准备工作就做完了。我们的目标是解析where表达式,将其转换为SQL,然后调用ExecuteSql方法返回数据,和通过直接调用where进行比较。...不过,我在这里就仅以此为例,解释下如何扩展并为表达式树解析增加更多的功能,使之可以应付更多类型的表达式。 IQueryable与 IEnumerable的异同?...而使用IEnumerableT>,所有对于IEnumerableT>的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,在内存中进行过滤和排序操作。...将程序员从对SQL语句的拼接(尤其是insert)中解放出来,它既容易错,又很难发现错误。现在插入的对象都是强类型的,就犹如插入一个List一样。
由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List 参数,因此就想着写一个扩展方法,直接把IEnumerable转换为List换为List类型,代码如下: using System; using System.Collections.Generic; using System.Linq; using...T>转换为IList /// /// T">...(this IEnumerableT> data, ExpressionT, object>> Text, ExpressionT, object>> Value, string...selectValue = "",SelectListItem NewItem=null) where T : class,new() { var list =
本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考。...,用于分组(GroupBy): List personList = new List { new Person...这种比第一种方法多了一个参数,那就是一个相等比较器,目的是为了当TKey为自定义的类时,GroupBy能根据TKey指定的类根据相等比较器进行分组, 因此,自定义类如何进行分组,GroupBy是不知道的...首先,将personList更改如下(下划线部分): List personList = new List { new..., FuncIEnumerable, TResult> resultSelector); 官方释义:根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值
如何修复 在解决装箱问题之前,请确保它确实会产生大量流量。如果是这样,你的任务就很明确:重写代码以消除装箱。当你引入某些值类型时,请确保不会在代码中的任何位置将值类型转换为引用类型。...如何发现 使用 dotMemory 比对两个快照 打开View memory allocations视图 找到产生大内存流量的集合类型 看看是否与 Dictionary.Resize、 List...(int i = 0; i < 1000; i++) { Foo(list); } } } Foo 方法中的列表被转换为 IEnumerable 接口,这意味着枚举器的进一步装箱...,因为ListT>.Enumerator是结构体。...Heap Allocation Viewer插件也会提示您有关隐藏分配的信息: image-20240605184800584 如何修复 避免将集合强制转换为接口。
有的集合要求元素具有相同的类型,这种集合一般通过泛型的方式定义,它们实现另一个接口IEnumerableT>(IEnumerableT>本身继承自IEnumerable),这样的集合有ListT>...类型呢,毕竟从编程角度来看,它们还是不同的,很多时候使用IListT>要比直接使用数组方便得多。...图1 在添加服务引用时指定集合类型 二、IEnumerable与IList 上面我们介绍了IEnumerableT>、Array与IListT>这3种集合类型的序列化规则,这3种集合类型有一个共同的特点...当然你可以通过修改服务引用关于输出集合类型,使参数类型按照你希望的形式输出(如果先择GenericList,那么参数类型将会转换为List)。...,这是很好理解的。
但是,可能需要了解 2 个基本概念: 创建泛型集合类(如 ListT>)的实例时,需将“T”替换为列表将包含的对象类型。...例如,字符串列表表示为 List,Customer 对象列表表示为 List。...IEnumerableT> 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。...泛型集合类支持 IEnumerableT>,正如非泛型集合类(如 ArrayList)支持 IEnumerable。 有关泛型的详细信息,请参阅泛型。...LINQ 查询中的 IEnumerable 变量 LINQ 查询变量被类型化为 IEnumerableT> 或者派生类型(如 IQueryableT>)。
还有就是继承IEnumerableT>对象让我们自己的集合类型具备LINQ的强类型的查询能力。当然具体要看我们需求,从技术角度看目前只有这两点可以扩展。...如果我们从继承IEnumerableT>对象扩展,那么情况会有点小复杂,你的扩展方法中要扩展的对象一定要具体的给出对象的定义才行,如果你扩展的对象不能和继承的对象保持一直,那么你将断掉所有的扩展方法。...但是大部分情况下我们都是针对所有的IEnuneraleT>类型进行扩展的,这样可以很好的结合Linq的链式编程。原理就这么多,根据具体项目需要适当的采纳。...每当Where过后紧接着Select他们是如何关联一个完整的查询的?IQueryableT>并非IEnumerableT>对象,无法实时的做出处理然后将结果返回给下一个方法接着执行。...} 这是IQueryableT>接口中从IEnumerableT>继承下来的两个返回IEnumerator接口类型的方法,在我们目前使用的Linq to Sql、Linq to Entity中都会返回强类型的集合对象
俗话说知其然,知其所以然,平常看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的集合类?...: 如果我们集合是通过封装其它集合类而来的,那么我们可以直接返回这个集合的enumerator 通过yield return 来返回 实现我们自己的IEnumerator来实现 这里给大家演示一下如何通过...和ICollection 从最上面第一张图我们可以知道,ICollection是直接继承自IEnumerable。...如果想要快速查询的同时又能很好的支持排序的话,那就使用SortedDictionary吧。...ListT> LinkedListT> HashSetT> SortedSetT> StackT> QueueT> ListT> 泛型的List 类提供了不限制长度的集合类型,List
list">用于初始化线程安全集合的元素的 T:System.Collections.Generic.IEnumerable`1"/> 集合... public SynchronizedCollection(object syncRoot, IEnumerableT> list); /// IEnumerator IEnumerable.GetEnumerator(); /// /// 从特定索引处开始,将集合中的元素复制到指定的数组...(1).首先替换包含方法(ListT>的T部分)的那个类型的类型参数,如将T替换为string: List ConverAll(Conver<string,TOutput...(4).转换类型约束: 转换类型约束:允许你指定另一个类型,类型实参必须可以通过一致性、引用或装箱转换隐式地转换为该类型。还可以规定类型实参必须可以转换为另一个类型实参。
方法 提供add, remove, insert等功能 提供转换为IQueryable方法 LinkedListT> 没有索引,通过Find方法 ICollectionT> 内部使用链表实现的列表...IEnumerableT>替代作为返回类型 IQueryableT> 通过IndexOf IEnumerableT> 从远端获得筛选之后的资料,和IEnumerableT>不同,IQueryable...如何选择数据结构 在不同情况时选择恰当的数据结构,将会提升程序的性能。...迭代是指从集合的头部,一个一个将元素拿出来,直到全部拿完为止的操作。迭代不能倒车,只能前进。IEnumerable是迭代器模式的实现。 通常将迭代中拿出来的元素称为iterator。...IEnumerableT>是整个LINQ的基础。整个LINQ都基于IEnumerableT>的扩展方法之上。C#大部分数据结构都实现了IEnumerableT>。
i : n; }; 运行打印下结果: 从 C# 3 开始,lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数。...使用 lambda 声明运算符=>(读作 goes to) 从其主体中分离 lambda 参数列表。...我们需要扩展List类的方法,当然不用扩展方法也是可以实现,直接写方法然后调用,但是为了还原框架实现方式,我们模仿IEnumerable类(List 继承至IEnumerable)。...list, FuncT, bool> predicate) { ListT> tempList = new ListT>(); foreach...在IEnumerable扩展方法返回参数仍然是IEnumerable,所以可以像开始我们写的那样进行链式调用。
本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考。..., Func keySelector); 官方释义:根据指定的键选择器函数,从IEnumerable创建一个 ILookup..., TKey> keySelector, IEqualityComparer comparer); 官方释义:根据指定的键选择器函数和键比较器,从IEnumerable创建一个..., Func keySelector, Func elementSelector); 官方释义:根据指定的键选择器和元素选择器函数,从IEnumerable...TSource, TElement> elementSelector, IEqualityComparer comparer); 官方释义:根据指定的键选择器函数、比较器和元素选择器函数,从IEnumerable
领取专属 10元无门槛券
手把手带您无忧上云