可枚举字符串列表中字符串的索引或位置

本文关键字:字符串 索引 位置 枚举 列表 | 更新日期: 2023-09-27 17:53:42

可能重复:
如何获取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. 为什么不支持索引?(我们不会更改列表中的任何值,我们只是在查找它的位置!(

可枚举字符串列表中字符串的索引或位置

好吧,因为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;
 }

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

您可以将重载中的索引传递给SelectWhere:

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;

来自MSDN关于IList

表示可以通过索引单独访问。

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

var item = 
    TitleNames.Select( (tn, index) => new{tn, index})
      .FirstOrDefault(x => 
        string.Equals(x.tn, 
                      "testname", 
                      StringComparison.CurrentCultureIgnoreCase));
return item==null ? -1 : item.index;

TitleNamesIEnumerable,因此不支持索引。

你不能依赖枚举:

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

以计算索引。

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

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

因此,为了回答您的问题:您无法从IEnumerable<T>中获取对象的索引。如果需要索引支持,请使用IList<T>