C# 检查IEnumerable是否可用的正确方法<;T>;是由一个yield关键字创建的
检查是否由生成了C# 检查IEnumerable是否可用的正确方法<;T>;是由一个yield关键字创建的,c#,ienumerable,C#,Ienumerable,检查是否由生成了IEnumerable的正确方法是什么 收益率关键字 样本: public IEnumerable<int> GetMeSomeInts() { // Unknown implementation } public IEnumerable getMesoments() { //未知实现 } 某处: IEnumerable<int> someInts = GetMeSomeInts() ; if (someInts is generatedby
IEnumerable
的正确方法是什么
收益率关键字
样本:
public IEnumerable<int> GetMeSomeInts()
{
// Unknown implementation
}
public IEnumerable getMesoments()
{
//未知实现
}
某处:
IEnumerable<int> someInts = GetMeSomeInts() ;
if (someInts is generatedbyayield) // <- What should be this condition ?
someInts = someInts.ToList() ;
IEnumerable someInts=GetMeSomeInts();
如果(someInts由ayield生成)/由yield关键字创建的状态机未设计为“可检测”。如果您找到了检测它的方法,您将不得不依赖一些特定于实现的提示(例如类型名称的特定模式;您问题的注释中给出了一些示例),这些提示不属于C#spec的一部分,因此可能会随时更改
因此,没有正确的方法来检查yield关键字是否生成了IEnumerable
。我认为正确的方法是不检查。这就是接口的用途:它们隐藏实现
既然您没有提到为什么要找出IEnumerable是否由yield关键字生成,我将进行一个粗略的猜测,并假设您真正想问的是:
如果IEnumerable尚未实现,我如何实现它
这个问题已经得到了回答:
我不一定认为这是正确的方法,但一种方法是:
someInts.GetType().Name.Contains("<Yielded>")
someInts.GetType().Name.Contains(“”)
这可能是相当可靠的,因为这个名字很不正常。由于您依赖于深层的内部结构,所以它可能会在任何.NET版本之间发生变化,尽管我觉得它可能不会/没有
如果您使用它,请确保保留一个单元测试来检查它是否正常。这样,如果内部发生变化,您的单元测试将在构建服务器上失败。您究竟为什么要检查IEnumerable
是否由yield return创建?你真的想知道IEnumerable
是否已经具体化了吗?确实。你不应该在意。如果getmesoments
本身不是由迭代器块实现的,而是调用了其他的东西,那么您希望发生什么呢?@BG100:好吧,您可以使用一些启发式方法来准确地处理任何不故意愚弄系统的事情。。。但是这仍然是一个坏主意。@PabloHoney有各种各样的IEnumerables不使用yield
,如果多次迭代(例如,任何EF查询),这将非常昂贵。如果你接受的IEnumerable
不是来自已知来源,你就不应该重复多次,因为根本不可能知道它会有多贵。@PabloHoney首先检查这个IEnumerable
不是@TimSchmelter建议的集合。然后可以检查此对象的类型。检查它是否有NestedPrivate
,Sealed
,BeforeFieldInit
属性。然后检查IsConstructedGenericType
属性(即使对于泛型,它也应该是false
)。此外,您还可以检查名称是否具有某种奇怪的格式YourClassName+d_u0
。我不确定这种方法在100%的情况下是否有效。它需要更详细的研究。公认的答案是检查它是否是IList
,最好是检查它是否是ICollection
,它是父接口。@TimSchmelter,这取决于您需要如何处理它。@Servy:no,这个问题只是想知道如何检查序列是否已经物化。@TimSchmelter他想知道序列是否物化,以便他可以对其进行处理。我们不知道那是什么东西,也不知道他可能需要对这个对象进行什么操作来完成它。@chrismaric:你是对的,不按照问题中的字面意思解决问题就解决(假设的)根本问题是不好的风格。我添加了一个介绍性段落,解释为什么我认为原始问题的答案是“没有正确的方法”。我也解开了这个问题,所以你可以自己添加一个答案。