1

可能重复:
如何获取 IEnumerable 中元素的索引?

我有以下接受可枚举字符串列表的函数。

我遍历所有字符串,如果它的值等于“ TestName”(不区分大小写),我返回它的位置。

    int GetMyTestColumnPosition(IEnumerable<string> TitleNames)
    {
        foreach (var test in TitleNames)
        {
            if (string.Compare(test, "testname", stringComparison.CurrentCultureIgnoreCase) == 0)
            {
                // return TitleNames.IndexOf(test); does not work!
            }
        }
    } 

编辑:我将参数更改为“ IList<string>”,这有效!但,

  1. 如何在可枚举的字符串列表中查找字符串的索引或位置?
  2. 为什么 ienumerable 不支持 index ?(我们没有改变列表中的任何值,我们只是找出它的位置!)
4

5 回答 5

5

好吧,由于 IEnumerables 用于枚举,因此它们没有 IndexOf 方法也就不足为奇了。如果需要,您可以创建扩展方法。

但是,既然您已经在枚举,那么再次计算索引有什么意义呢?做这样的事情:

int index = 0;
foreach(var test in TitleNames)
{
    if(...) return index;
    index++;
}

想一想,这就是你想要的扩展方法:

public static int IndexOf(this IEnumerable<T> list, T item)
{
    int index = 0;
    foreach(var l in list)
    {
        if(l.Equals(item))
            return index;
        index++;
    }
    return -1;
 }

只需记住添加对空值的检查,并可能提供一个可选的比较器。

于 2013-01-15T10:45:36.910 回答
5

您可以将重载中的索引传递给Selector Where

var found = TitleNames
    .Select((str, index) => new { str, index })
    .Where(x => x.str.Equals("testname", StringComparison.CurrentCultureIgnoreCase))
    .FirstOrDefault();

if (found != null)
    return found.index;
return -1;
于 2013-01-15T10:45:53.787 回答
3

来自 MSDN 关于IList

表示可以通过索引单独访问的非通用对象集合。

IEnumerable是一个简单的枚举器,不支持索引。

于 2013-01-15T10:45:33.567 回答
0
var item = 
    TitleNames.Select( (tn, index) => new{tn, index})
      .FirstOrDefault(x => 
        string.Equals(x.tn, 
                      "testname", 
                      StringComparison.CurrentCultureIgnoreCase));
return item==null ? -1 : item.index;
于 2013-01-15T10:47:59.230 回答
0

TitleNamesIEnumerable,所以它不支持索引。

你不能依赖枚举:

int i = 0;
foreach(var test in TitleNames)
{
    i++;
}

计算索引。

您可以构建自己的类,该类继承自IEnumerable<T>并在枚举时以随机顺序返回对象。

如果大多数具体的 .Net 类型通常是索引友好的,那么它就是纯粹的实现细节。

所以,回答你的问题:你不能从IEnumerable<T>. IList<T>如果您需要索引支持,请使用。

于 2013-01-15T10:51:27.510 回答