Хотя вы не можете сделать это напрямую, вы можете сделать это через Cast
:
if (enumerable.Cast<object>().Any())
Это должно работать всегда, так как любой IEnumerable
может быть заключен в IEnumerable<object>
.Это закончится тем, что будет упакован первый элемент, если он на самом деле или IEnumerable<int>
или аналогичный, но он должен работать нормально.В отличие от большинства методов LINQ, Cast
и OfType
target IEnumerable
, а не IEnumerable<T>
.
Вы можете написать собственное подмножество методов расширения, таких как LINQ, но работающих на неуниверсальных IEnumerable
Напечатайте, если хотите, конечно.Реализация LINQ to Objects не очень сложна - вы можете использовать мой Edulinq проект , например, в качестве отправной точки.
В некоторых случаях вы могли бы реализовать Any(IEnumerable)
чуть более эффективно, чемиспользование Cast
- например, использование ярлыка, если цель реализует неуниверсальный интерфейс ICollection
.На этом этапе вам не нужно создавать итератор или брать первый элемент.В большинстве случаев это не будет иметь большого значения для производительности, но это то, что вы могли бы сделать, если бы оптимизировали.