KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
It appears that, in .NET, "array of enum" is not a strongly-typed concept. MyEnum[] is considered to implement not just IEnumerable<MyEnum> , but also IEnumerable<YourEnum> . (I didn't believe it at first either.) // Returns true: typeof(IEnumerable<DayOfWeek>).IsAssignableFrom(typeof(AttributeTargets[])) // Outputs "3": var listOfLists = new List<object> { new[] { AttributeTargets.All }, new[] { ConsoleColor.Blue }, new[] { PlatformID.Xbox, PlatformID.MacOSX } }; Console.WriteLine(listOfLists.OfType<IEnumerable<DayOfWeek>>().Count()); So when I go looking through a list for everything that implements IEnumerable<T> , I'm getting the T[] s and the List<T> s and the iterator-generated IEnumerable<T> s, but I'm also getting the SomethingElse[] s that I do not want. What's the easiest way to find out whether a given Type (as with IsAssignableFrom above) or a given instance (as with OfType<T> above) really and truly implements, say, IEnumerable<DayOfWeek> ? I gave Mr. Skeet the green checkmark, but once I got his code into Visual Studio, ReSharper suggested a more concise version. Use whichever version you prefer. public static IEnumerable<IEnumerable<T>> OfSequenceType<T> (this IEnumerable source) where T : struct { return from sequence in source.OfType<IEnumerable<T>>() let type = sequence.GetType() where !type.IsArray || type.GetElementType() == typeof (T) select sequence; }
Tags (comma-separated)
Save Edits
Cancel