可枚举字符串列表中字符串的索引或位置
本文关键字:字符串 索引 位置 枚举 列表 | 更新日期: 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>
",这很有效!但是,
- 如何在枚举字符串列表中查找字符串的索引或位置
- 为什么不支持索引?(我们不会更改列表中的任何值,我们只是在查找它的位置!(
好吧,因为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的检查,并可能提供一个可选的比较器。
您可以将重载中的索引传递给Select
或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;
来自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;
TitleNames
是IEnumerable
,因此不支持索引。
你不能依赖枚举:
int i = 0;
foreach(var test in TitleNames)
{
i++;
}
以计算索引。
您可以构建自己的类,该类继承自IEnumerable<T>
,并在枚举时按随机顺序返回对象。
如果大多数具体的.Net类型通常都是对索引友好的,那么它就是纯粹的实现细节。
因此,为了回答您的问题:您无法从IEnumerable<T>
中获取对象的索引。如果需要索引支持,请使用IList<T>
。