- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
像这样的一段代码
List<int> foo = new List<int>() { 1, 2, 3, 4, 5, 6 };
IEnumerable<int> bar = foo.Where(x => x % 2 == 1);
bar
类型为 System.Linq.Enumerable.WhereListIterator<int>
由于延迟执行。因为它实现了 IEnumerable<int>
可以将其转换为 List<int>
使用 ToList()
.但是,我一直无法识别在 ToList()
时运行的代码的某些部分。叫做。我正在使用 dotPeek 作为反编译器,这是我第一次尝试这样的事情,如果我在途中犯了任何错误,请纠正我。
我将在下面描述到目前为止我发现的内容(所有程序集都是版本 4.0.0.0):
Enumerable.WhereArrayIterator<TSource>
在文件 Enumerable.cs
中实现命名空间 System.Linq
在装配System.Core
.该类既没有定义 ToList()
本身也不实现 IEnumerable<TSource>
.它实现了 Enumerable.Iterator<TSource>
它位于同一个文件中。 Enumerable.Iterator<TSource>
执行IEnumerable<TSource>
.
ToList()
是一个扩展方法,也位于 Enumerable.cs
中.它所做的只是空检查,然后调用 List<TSource>
的构造函数。及其论点。
List<T>
在文件 List.cs
中定义命名空间 System.Collections.Generic
在装配mscorlib
. ToList()
调用的构造函数有签名public List(IEnumerable<T> collection)
.它再次进行空检查,然后将参数转换为 ICollection<T>
.如果集合没有元素,它会创建一个空数组的新列表,否则它使用 ICollection.CopyTo()
创建新列表的方法。
ICollection<T>
在 mscorlib
中定义\System.Collections.Generic
\ICollection.cs
.它实现了 IEnumerable
通用和非通用形式。
这就是我卡住的地方。都不是 Enumerable.WhereArrayIterator<TSource>
也不Enumerable.Iterator<TSource>
实现 ICollection
,所以在某个地方,必须进行强制转换,我无法找到在 CopyTo()
时运行的代码被称为。
最佳答案
这是 List<T>
constructor 中的相关部分(ILSpy):
ICollection<T> collection2 = collection as ICollection<T>; // this won't succeed
if (collection2 != null)
{
int count = collection2.Count;
this._items = new T[count];
collection2.CopyTo(this._items, 0);
this._size = count;
return;
}
// this will be used instead
this._size = 0;
this._items = new T[4];
using (IEnumerator<T> enumerator = collection.GetEnumerator())
{
while (enumerator.MoveNext())
{
this.Add(enumerator.Current);
}
}
所以你看到了collection as ICollection<T>;
尝试转换为 ICollection<T>
, 如果有效 CopyTo
将被使用,否则序列将被完全枚举。
你的 WhereListIterator<int>
是一个查询 而不是一个集合,所以它不能转换为 ICollection<T>
, 因此它将被枚举。
关于c# - WhereListIterator.ToList() 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17726863/
在 ToList() 中指定具体类型是否有意义? , AsEnumerable()等方法? 威尔.ToList()执行速度比 .ToList() 快? 最佳答案 如果编译器推断出一种类型而您想要指定另
给定在内存中(不是 LINQ to SQL)类列表: List myItems = /*lots and lots of items*/; 我正在使用 GroupBy() 语句对其进行分组: myIt
我对此不是 100%,所以我需要专家的意见。 ConcurrentQueue queue = new ConcurrentQueue(); List listA = queue.ToArray().T
JDK 引入了一个 API Stream.toList() 和 JDK-8180352 。这是我尝试将其性能与现有 Collectors.toList 进行比较的基准测试代码: @BenchmarkM
说到性能,我应该使用 .ToList().Distinct() 还是 .Distinct().ToList() ? 两种扩展方法是否生成相同的 SQL 查询? 看起来第二种方法应该表现更好,但这是真的
当我调用它时: using (var db = new MyDbContext()) { var yy = db.Products.Select(xx => xx.Id); var i
我正在寻找这些 LINQ 表达式的确认/澄清: var context = new SomeCustomDbContext() // LINQ to Entities? var items = co
JDK 16 now includes a toList() method directly on Stream instances。在以前的Java版本中,您始终必须使用collect方法并提供Co
我真的很困惑如何解决这个问题 public bool DeleteVegetationZone(ref Assessment objAssessment, int VegetationZoneIDT
import numpy as np from scipy.sparse import lil_matrix 使用 numpy 我得到 test_mat = (np.ones((4,6))) test
当我有一个 IEnumerable我不知道它是否是一个列表(根据 List ),我必须枚举 IEnumerable以确保我不会枚举那个可枚举项两次(例如循环两次,或类似的事情)。 Resharper
我不知道 LinqQuery.ToList().Distinct() 和 LinqQuery.Distinct().ToList(); 对我来说有什么区别看起来一样。 考虑这个示例代码: List s
给定以下 LINQ 语句,哪个更有效? 一个: public List GetLatestLogEntries() { var logEntries = from entry in db.Lo
我正在尝试使用 Moq 模拟 Entity Framework DbContext,尤其是它的扩展方法 Add()、Tolist() 和 Find()。 我需要 Find() 和 ToList() 方
这个问题在这里已经有了答案: java 8 Collector is not a functional interface, who can tell why? (2 个回答) Java8: Usin
我只是在尝试新的 kotlin 语言。我遇到了生成无限列表的序列。我生成了一个序列并尝试打印前 10 个元素。但是下面的代码没有打印任何东西: fun main(args: Array) {
我们的代码库中都弹出了这两个代码 pandas.DataFrame.columns.values.tolist() pandas.DataFrame.columns.tolist() 这些总是相同的吗
这些 linq 查询有什么区别: Students.Where(x=>x.City == "Lahore").ToList(); Students.ToList().Where(x=>x.City =
我试图通过创建一个存储前 3 个值的单独变量来过滤数组列表。但是,在集合中出现错误。我对此很陌生,所以任何帮助都会很棒! public static ArrayList exerciseDetail(
我看到以下代码: using(var iterator = source.GetEnumerator()) {...} 哪里source是 IEnumerable . 执行上述操作与转换相比有何优势
我是一名优秀的程序员,十分优秀!