我知道有两种方法可以IEnumerable从ArraylistLinq中输出类型,并想知道在哪些情况下使用它们?
例如
IEnumerable<string> someCollection = arrayList.OfType<string>()
Run Code Online (Sandbox Code Playgroud)
要么
IEnumerable<string> someCollection = arrayList.Cast<string>()
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别,我应该在哪里应用每种情况?
我更喜欢使用IEnumerable<object>,对于LINQ扩展方法是定义的,不是IEnumerable,所以我可以使用,例如,range.Skip(2).不过,我也喜欢使用IEnumerable,对于T[]隐式转换为IEnumerable是否T是引用类型或值类型.对于后一种情况,不涉及拳击,这是好的.结果,我能做到IEnumerable range = new[] { 1, 2, 3 }.似乎不可能将两者的优点结合起来.无论如何,IEnumerable当我需要应用LINQ方法时,我选择安顿下来并做一些演员.
从这个 SO线程,我开始知道range.Cast<object>()能够完成这项工作.但它会产生性能开销,这在我看来是不必要的.我尝试执行直接编译时强制转换(IEnumerable<object>)range.根据我的测试,它适用于参考元素类型,但不适用于值类型.有任何想法吗?
仅供参考,问题源于此 GitHub问题.我使用的测试代码如下:
static void Main(string[] args)
{
// IEnumerable range = new[] { 1, 2, 3 }; // won't work
IEnumerable range = new[] { "a", "b", "c" };
var range2 = (IEnumerable<object>)range;
foreach (var item in range2)
{
Console.WriteLine(item);
}
}
Run Code Online (Sandbox Code Playgroud) 随机示例:
ConfigurationElementCollection
Run Code Online (Sandbox Code Playgroud)
.Net有很多这些WhateverCollection没有实现的IEnumerable<T>小类,这意味着我不能将Linq用于开箱即用的对象.甚至在Linq之前,你会认为他们会想要使用泛型(我相信它已经在C#2中一直被引入)
似乎我一直遇到这些讨厌的小集合类型.有一些技术原因吗?
假设我在设计时知道类型,IEnumerable<T>有IEnumerable没有办法从无反射中得到一个?
我有这个
foreach(DirectoryEntry child in de.Children)
{
// long running code on each child object
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试启用并行化,就像这样
Parallel.ForEach(de.Children,
(DirectoryEntry child) => { // long running code on each child });
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为de.Children属于类型DirectoryEntries.它实现IEnumerable但不实现IEnumerable<DirectoryEntry>.
c# parallel-processing active-directory task-parallel-library