Здесь вы можете проверить код ошибки и решить проблему
Рекурсивное решение:
IEnumerable Flatten(IEnumerable array)
{
foreach(var item in array)
{
if(item is IEnumerable)
{
foreach(var subitem in Flatten((IEnumerable)item))
{
yield return subitem;
}
}
else
{
yield return item;
}
}
}
РЕДАКТИРОВАНИЕ 1:
Jon объясняет в комментариях, почему это не может быть общим методом, смотреть!
РЕДАКТИРОВАНИЕ 2:
Матовое предложенное создание его дополнительный метод. Здесь Вы идете, просто заменяете первую строку:
public static IEnumerable Flatten(this IEnumerable array)
и можно использовать его как это:
foreach(var item in myArray.Flatten()) { ... }
Я ответил бы в комментарии, но мне нужны больше чем 300 символов.
Решение @Alexander является потрясающим, но оно сталкивается с проблемой с массивами строк. Так как строка реализует IEnumerable, я думаю, что это закончит тем, что возвратило каждый символ в каждой строке. Можно использовать универсальный параметр для сообщения этого, какую вещь Вы надеетесь возвратить в этих случаях, например:
public static IEnumerable Flatten<T>(IEnumerable e)
{
if (e == null) yield break;
foreach (var item in e)
{
if (item is T)
yield return (T)item;
else if (item is IEnumerable)
{
foreach (var subitem in Flatten<T>((IEnumerable)item))
yield return subitem;
}
else
yield return item;
}
}
Не могли бы вы просто использовать IEnumerable # SelectMany?