字符串的索引或位置在不可数字符串列表中

时间:2013-01-15 10:42:39

标签: c# .net string visual-studio-2010 .net-4.0

  

可能重复:
  How to get the index of an element in an 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. 为什么nienumerable不支持索引? (我们没有改变列表中的任何值,我们只是找到它的位置!)

5 个答案:

答案 0 :(得分: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;
 }

请记住添加空值检查,并提供可选的比较器。

答案 1 :(得分:4)

您可以将重载中的索引传递给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;

答案 2 :(得分:3)

来自MSDN关于IList

  

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

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

答案 3 :(得分: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;

答案 4 :(得分:0)

TitleNamesIEnumerable,因此它不支持索引。

您不能依赖枚举:

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

计算索引。

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

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

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