Что соответствующий путь состоит в том, чтобы сильно ввести возврат родовой функции?

Ваш второй цикл for проходит все итерации, блокируя первую, пока не завершится.

Вот почему я печатаю 1, пока j не достигнет 10

for (int i = 0; i < 10; i++){
   printf("positions %d %d\n", i, i+1);
}
5
задан 6 revs, 4 users 99% 5 March 2009 в 01:41
поделиться

7 ответов

Следующий дополнительный метод, включенный в Linq, делает точно, в чем Вы нуждаетесь:

IEnumerable<T> OfType<T>(this IEnumerable enumerable);

Вот пример использования:

List<object> objects = //...

foreach(string str in objects.OfType<string>())
{
    //...
}

Как Вы видите, они использовали универсальный параметр в качестве спецификатора типа возврата. Это более просто и более безопасно, чем использование Типа или строки и возврата не безопасное с точки зрения типов перечисление.

9
ответ дан 18 December 2019 в 12:02
поделиться

Я обычно предпочитаю окончательную версию - она указывает всю релевантную информацию и ничто иное. Учитывая версию с параметрами, если бы Вы были плохо знакомы с кодом разве, Вы не ожидали бы, что значение параметра будет значимо, а не просто тип?

Достаточно редко этот "фиктивный параметр" шаблон полезен, но я обычно избегал бы его - или по крайней мере обеспечивал бы перегрузку, которая не потребовала его.

4
ответ дан 18 December 2019 в 12:02
поделиться

При использовании платформы 3.5 это уже реализовано в IEnumerable:

IEnumerable<string> s = someList.OfType<string>()
1
ответ дан 18 December 2019 в 12:02
поделиться

Самый чистый путь был бы

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>();
1
ответ дан 18 December 2019 в 12:02
поделиться

это - мои 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
0
ответ дан 18 December 2019 в 12:02
поделиться

Это ясно (мне, по крайней мере), что Вы хотели бы окончательную версию:

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>, но иначе это просто больше вводит с меньшей ясностью.

0
ответ дан 18 December 2019 в 12:02
поделиться

Я думаю, что это в значительной степени, что Вы хотите.

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;
    }
}
0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: