没有指定泛型类型的C#接口IEnumerable Any()

时间:2018-10-02 00:37:41

标签: c# linq ienumerable

我投了

var info = property.Info;
object data = info.GetValue(obj);

...

var enumerable = (IEnumerable)data;

if (enumerable.Any())  ///Does not compile
{
}

if (enumerable.GetEnumerator().Current != null) // Run time error
{
}

,我想通过使用Linq Query Any()来查看此枚举是否具有任何元素。但是不幸的是,即使使用Linq,我也不能。

如何在不指定泛型类型的情况下执行此操作。

3 个答案:

答案 0 :(得分:11)

虽然您不能直接执行此操作,但是可以通过Cast进行操作:

if (enumerable.Cast<object>().Any())

这应该始终有效,因为任何IEnumerable都可以包装为IEnumerable<object>。如果实际上IEnumerable<int>或类似名称,它将最终装箱在第一个元素上,但是应该可以正常工作。与大多数LINQ方法不同,CastOfType的目标是IEnumerable而不是IEnumerable<T>

您当然可以编写自己的扩展方法子集,例如LINQ方法,但是可以在非通用IEnumerable类型上运行。对对象实施LINQ并不困难-例如,您可以使用我的Edulinq project作为起点。

在某些情况下,您实现Any(IEnumerable)的效率可能比使用Cast的效率略高-例如,如果目标实现了非通用的ICollection接口,则可以采取捷径。那时,您将不需要创建迭代器或采用第一个元素。在大多数情况下,性能不会有太大变化,但这是您可以进行优化的事情。

答案 1 :(得分:1)

一种方法是使用foreach, as noted in IEnumerable "Remarks"。它还提供了有关GetEnumerator结果以外的其他方法的详细信息。

bool hasAny = false;
foreach (object i in (IEnumerable)(new int[1] /* IEnumerable of any type */)) {
    hasAny = true;
    break;
}

(这本身很容易转换为扩展方法。)

答案 2 :(得分:0)

您尝试使用 [HttpGet] public JsonResult ListaVisuAviso(string id) { //var avisoid = 4; var avisoid = Convert.ToDecimal(id); var query = from a in _dataContext.TB_AVISOS_NOTIFICACOES join b in _dataContext.VW_USUARIOS4 on a.USUARIO_PR equals b.USUARIOID where a.AVISO_ID == avisoid select new VisuAviso() { NOME = b.NOME, DATA_HORA = a.DATA_HORA.ToString(), DEPARTAMENTO = b.DEPARTAMENTO }; return Json(query, JsonRequestBehavior.AllowGet); 试图获取尚未移动到第一个位置的枚举数的当前值。如果第一项存在或为空,它也会给出错误的结果。您可以做的事情(以及 $("#visualizacao").on('show.bs.modal', function (e) { var idAviso = $(e.relatedTarget).attr('data-avisoid'); $.ajax({ type: 'GET', url: 'ListaVisuAviso/?usuarioId =' + idAviso, dataType: 'json', success: function (response) { $('#visu-table tbody').empty(); var trHTML = ''; $.each(response, function (i, item) { trHTML += '<tr><td>' + item.NOME + '</td><td>' + item.DATA_HORA + '</td><td>' + item.DEPARTAMENTO + '</td></tr>'; }); $('#visu-table tbody').append(trHTML); $('#modal-visu').modal('show'); }, error: function (xhr) { console.log(xhr); } }); $('#modalAviso').modal('show'); }); 中的GetEnumerator().Current所做的事情)是看是否有可能移至第一项。即是否有第一项要移至:

Any()