首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询IEnumerable作为IEnumerable<Type>

查询IEnumerable作为IEnumerable<Type>
EN

Stack Overflow用户
提问于 2016-03-10 09:21:52
回答 4查看 151关注 0票数 1

我有一个需要有效解决的问题。

我需要IEnumerable源代码中元素的索引,我可以这样做的一种方法是使用以下方法

代码语言:javascript
复制
    var items = source.Cast<ObjectType>().Where(obj => obj.Start == forDate);

这将给出与谓词匹配的所有项的IEnumerable。

代码语言:javascript
复制
   if(items != null && items.Any()){
       // I now need the ordinal from the original list
       return source.IndexOf(items[0]);
   }

然而,这份清单可能很大,而且行动将多次进行。我认为这是没有效率的,必须有更好的办法。

如果有人能给我指明正确的方向,我将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-10 09:29:08

有时,忘了Linq并回到基础上是很好的:

代码语言:javascript
复制
int index = 0;

foeach (ObjectType element in source)
{
    if (element.Start == forDate)
    {
        return index;
    }

    index++;
}

// No element found
票数 2
EN

Stack Overflow用户

发布于 2016-03-10 09:29:18

使用Linq,可以在筛选每个对象之前获取它们的索引:

代码语言:javascript
复制
source
    .Cast<ObjectType>()
    .Select((obj, i) => new { Obj = obj, I = i })
    .Where(x => x.Obj.Start == forDate)
    .Select(x => x.I)
    .FirstOrDefault();

然而,这并不是真正有效的做法,如果没有拨款,下面的做法也是如此:

代码语言:javascript
复制
int i = 0;
foreach (ObjectType obj in source)
{
    if (obj.Start == forDate)
    {
        return i;
    }
    i++;
}
票数 2
EN

Stack Overflow用户

发布于 2016-03-10 09:29:24

第二个代码示例无效:因为items是一个IEnumerable,所以不能调用items[0]。您可以使用First()。总之:

代码语言:javascript
复制
var items = source.Cast<ObjectType>()
.Select((item, index) => new KeyValuePair<int, ObjectType>(index, item))
.Where(obj => obj.Value.Start == forDate);

然后:

代码语言:javascript
复制
if (items != null && items.Any()) {
    return items.First().Key;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35912237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档