我投了
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,我也不能。
如何在不指定泛型类型的情况下执行此操作。
答案 0 :(得分:11)
虽然您不能直接执行此操作,但是可以通过Cast
进行操作:
if (enumerable.Cast<object>().Any())
这应该始终有效,因为任何IEnumerable
都可以包装为IEnumerable<object>
。如果实际上是IEnumerable<int>
或类似名称,它将最终装箱在第一个元素上,但是应该可以正常工作。与大多数LINQ方法不同,Cast
和OfType
的目标是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()