我有一个需要有效解决的问题。
我需要IEnumerable源代码中元素的索引,我可以这样做的一种方法是使用以下方法
var items = source.Cast<ObjectType>().Where(obj => obj.Start == forDate);这将给出与谓词匹配的所有项的IEnumerable。
if(items != null && items.Any()){
// I now need the ordinal from the original list
return source.IndexOf(items[0]);
}然而,这份清单可能很大,而且行动将多次进行。我认为这是没有效率的,必须有更好的办法。
如果有人能给我指明正确的方向,我将不胜感激。
发布于 2016-03-10 09:29:08
有时,忘了Linq并回到基础上是很好的:
int index = 0;
foeach (ObjectType element in source)
{
if (element.Start == forDate)
{
return index;
}
index++;
}
// No element found发布于 2016-03-10 09:29:18
使用Linq,可以在筛选每个对象之前获取它们的索引:
source
.Cast<ObjectType>()
.Select((obj, i) => new { Obj = obj, I = i })
.Where(x => x.Obj.Start == forDate)
.Select(x => x.I)
.FirstOrDefault();然而,这并不是真正有效的做法,如果没有拨款,下面的做法也是如此:
int i = 0;
foreach (ObjectType obj in source)
{
if (obj.Start == forDate)
{
return i;
}
i++;
}发布于 2016-03-10 09:29:24
第二个代码示例无效:因为items是一个IEnumerable,所以不能调用items[0]。您可以使用First()。总之:
var items = source.Cast<ObjectType>()
.Select((item, index) => new KeyValuePair<int, ObjectType>(index, item))
.Where(obj => obj.Value.Start == forDate);然后:
if (items != null && items.Any()) {
return items.First().Key;
}https://stackoverflow.com/questions/35912237
复制相似问题