Correct way to check if IEnumerable<T> is created by a yield keyword

。_饼干妹妹 提交于 2020-01-21 07:36:10

问题


What is the correct way to check if an IEnumerable<T> is generated by the yield keyword ?

Sample :

public IEnumerable<int> GetMeSomeInts() 
{
   // Unknown implementation
}

Somewhere :

IEnumerable<int> someInts = GetMeSomeInts() ;

if (someInts is generatedbyayield) // <- What should be this condition ? 
      someInts = someInts.ToList() ; 

回答1:


The state machine created by the yield keyword was not designed to be "detectable". If you find a way to detect it, you will have to rely on some implementation-specific hints (such as a specific pattern of the type name; some examples are given in the comments of your question), which are not part of the C# spec and, thus, might change at any time.

Thus, there is no correct way to check if an IEnumerable<T> is generated by the yield keyword. I would argue that the correct way is not to check. That's what interfaces are for: They hide the implementation.


Since you did not mention why you want to find out whether the IEnumerable was generated by the yield keyword, I will make a wild guess and assume that what you actually wanted to ask was:

How can I materialize an IEnumerable if it has not been materialized yet?

That question has been answered already:

  • Is there a way to Memorize or Materialize an IEnumerable?



回答2:


I wouldn't necessarily say it's the correct way, but A way is:

someInts.GetType().Name.Contains("<Yielded>")

This is probably fairly reliable since this name is very abnormal. Since you're relying on deep internals it could change between any .NET release, although i feel it probably wouldn't/hasn't.

If you use this, make sure to keep a unit test to sanity check it. Such that if the internals do change, your unit test will fail on the build server.



来源:https://stackoverflow.com/questions/34183713/correct-way-to-check-if-ienumerablet-is-created-by-a-yield-keyword

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!