Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c#

ienumerable

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() ; 
like image 497
Pablo Honey Avatar asked Jan 08 '23 00:01

Pablo Honey


2 Answers

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?
like image 149
Heinzi Avatar answered Jan 31 '23 15:01

Heinzi


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.

like image 29
Chris Marisic Avatar answered Jan 31 '23 16:01

Chris Marisic