我有以下函数接受可以发生的字符串列表。
我循环遍历所有字符串,如果其值等于“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>
”,这有效!但是,
答案 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)
您可以将重载中的索引传递给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;
答案 2 :(得分:3)
答案 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)
TitleNames
为IEnumerable
,因此它不支持索引。
您不能依赖枚举:
int i = 0;
foreach(var test in TitleNames)
{
i++;
}
计算索引。
您可以构建自己的类,该类继承自IEnumerable<T>
并在枚举时以随机顺序返回对象。
如果大多数具体的.Net类型通常都是索引友好的,那么它就是纯粹的实现细节。
因此,要回答您的问题:您无法从IEnumerable<T>
获取对象索引。如果您想要索引支持,请使用IList<T>
。