Ваш второй цикл for проходит все итерации, блокируя первую, пока не завершится.
Вот почему я печатаю 1, пока j не достигнет 10
for (int i = 0; i < 10; i++){
printf("positions %d %d\n", i, i+1);
}
Следующий дополнительный метод, включенный в Linq, делает точно, в чем Вы нуждаетесь:
IEnumerable<T> OfType<T>(this IEnumerable enumerable);
Вот пример использования:
List<object> objects = //...
foreach(string str in objects.OfType<string>())
{
//...
}
Как Вы видите, они использовали универсальный параметр в качестве спецификатора типа возврата. Это более просто и более безопасно, чем использование Типа или строки и возврата не безопасное с точки зрения типов перечисление.
Я обычно предпочитаю окончательную версию - она указывает всю релевантную информацию и ничто иное. Учитывая версию с параметрами, если бы Вы были плохо знакомы с кодом разве, Вы не ожидали бы, что значение параметра будет значимо, а не просто тип?
Достаточно редко этот "фиктивный параметр" шаблон полезен, но я обычно избегал бы его - или по крайней мере обеспечивал бы перегрузку, которая не потребовала его.
При использовании платформы 3.5 это уже реализовано в IEnumerable:
IEnumerable<string> s = someList.OfType<string>()
Самый чистый путь был бы
public static IEnumerable<T> Filter<T>(IEnumerable<T> source)
Это удаляет все небезопасные с точки зрения типов функции. Можно затем преобразовать любой неуниверсальный IEnumerable в универсальную версию с вызовом броска
IEnumerable enumerable = GetMyEnumerable();
var filtered = Filter(enumerable.Cast<string>());
Вы могли также дополнительно сделать это дополнительным методом и выполнить вызов еще больше направления потока.
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source)
...
var filtered = GetMyEnumerable().Cast<string>().Filter();
Править
OP упомянула, что они только хотят отфильтровать к определенным типам. В этом случае можно просто использовать Счетный. OfType
var filtered = GetMyEnumerable().OfType<SomeType>();
это - мои 2 цента. Я немного смущен тем, что Вы пытаетесь отфильтровать. IEnumerable неуниверсален, поэтому как Вы собираетесь отфильтровать неуниверсальный источник и возвратить результат IEnuerable.
Я думаю, что самое чистое
public static IEnumerable<T> Filter<T>(IEnumerable<T> source)
можно даже вставить универсальные проверки типа, если Вы знаете, из каких типов Ваш фильтр T будет иметь, например, только классы или объекты определенный интерфейсный или базовый класс, или оценивать типы.. как так.
public static IEnumerable<T> Filter<T>(IEnumerable<T> source) where T : class
public static IEnumerable<T> Filter<T>(IEnumerable<T> source) where T : struct
Это ясно (мне, по крайней мере), что Вы хотели бы окончательную версию:
IEnumerable<T> Filter<T>(IEnumerable source)
процессом сокращения, если ничто иное.
Первая версия:
IEnumerable<T> Filter<T>(IEnumerable source, Type type)
должен иметь дело с сумасшествием, куда я передаю в Типе, который не соответствует ограничению:
Вторая версия:
IEnumerable<T> Filter<T>(IEnumerable source, T type)
заставляет меня создать пример, который может быть дорогим или в других отношениях недоступным конструкции. Кроме того, что, если я передаю в пустом указателе (в любом случае)?
Как в стороне, для единственных ограничений, я думаю, что параметр типа должен быть T. Можно сойти с рук TResult, если это - возврат функции - как Func <TResult>, но иначе это просто больше вводит с меньшей ясностью.
Я думаю, что это в значительной степени, что Вы хотите.
public static IEnumerable<T> OfType<T>(IEnumerable source) {
foreach (object obj in source)
if (obj is T)
yield return (T)obj;
}
Немного более сложная версия, но (вероятно) немного быстрее была бы
public static IEnumerable<T> OfType<T>(IEnumerable source) {
foreach (object obj in source) {
T result = obj as T;
if (result != null)
yield return result;
}
}