c#,获取列表中当前T的索引<;T>;

c#,获取列表中当前T的索引<;T>;,c#,arraylist,C#,Arraylist,我搜索了不少,也许我偶然发现了一些相似的东西,但这对我来说仍然是陌生的,因为我对c#还不熟悉 我想从列表中获取对象Tline的当前索引 我知道我可以简单地用int i进行迭代。但是我不明白为什么或者怎样才能在不寻找任何东西的情况下将它作为我拥有的当前iteam的索引。 Tline有点像 public class Tline { public string Cd_m { get; set; } public string cd_d {

我搜索了不少,也许我偶然发现了一些相似的东西,但这对我来说仍然是陌生的,因为我对c#还不熟悉

我想从列表中获取对象Tline的当前索引 我知道我可以简单地用int i进行迭代。但是我不明白为什么或者怎样才能在不寻找任何东西的情况下将它作为我拥有的当前iteam的索引。

Tline有点像

public class Tline
    {
        public string Cd_m { get; set; }           
        public string cd_d { get; set; }
        public string cd_c { get; set; }
       ...
    }

我的问题在这里(用箭头表示)

类ACCS
{
内部无效数据写入(列表IMOPRTI)
{
OLEDB连接myAccessConn=null;
字符串sFld=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
字符串dbName=“EDIM1.mdb”;
dbName=Path.Combine(sFld,dbName);
string accessConn=string.Format(“Provider=Microsoft.Jet.OLEDB.4.0;数据源={0}”,dbName);
string sqlQuery=“插入到DOTes(`id`、`cd_m`、`cd_d`、`cd_c`、`nume`)值(?、、、、?、?)”;
myAccessConn=新的OLEDB连接(accessConn);
int i=2;
foreach(在IMOPRTTI中的var insT)
{
使用(OleDbCommand cmd=new OleDbCommand(sqlQuery,myAccessConn))
{
cmd.Connection.Open();
cmd.Parameters.AddWithValue(“@id”,i.ToString());
cmd.Parameters.AddWithValue(“@cd_m”,“2018”);
cmd.Parameters.AddWithValue(“@cd_d”,“BO”);
cmd.Parameters.AddWithValue(“@cd_c”,“C00128”);
//显示当前Tline索引↓↓↓↓↓↓↓
cmd.Parameters.AddWithValue(@nume),(imoprati.GetEnumerator().Current));//尝试任何操作
cmd.ExecuteNonQuery();
cmd.Connection.Close();
i++;
}
}
}

}

imoprati.GetEnumerator().Current
不起作用,因为您正在创建一个独立的迭代器,它有自己的位置(当前位于第一项之前)。您在这里的最佳选择可能是一个简单的计数器:

int index = 0;
foreach (var insT in imoprtati) {
    // your stuff here...


    index++;
}
有一个LINQ方法包含索引,但由于自定义结构迭代器、捕获的变量等(复杂主题),该方法的效率会降低。

List.GetEnumerator()。Current将为列表创建一个新的枚举器,然后返回当前项,而不是索引。这不会像你看到的那样起作用

当列表实现IList时,您可以使用IndexOf(T项);方法查找项的基于0的索引

但是,此方法不能保证恒定的O(1)性能,因为它必须在列表中搜索。一个更好的替代方法是,如前所述,在遍历索引时记录索引


如果不记录索引,就无法在固定时间内找到列表中任意项的索引,因此我建议您这样做。

您是否尝试过
imoprati.IndexOf(Current)
?在这种情况下,最好使用
for
循环,因为您需要索引和关联的item@vc74实际上可能不是(至少,如果你是个书呆子)由于<代码>清单>代码>自定义结构迭代器对索引器工作,使用<代码>对于可能会有相当高的代价;如果这是一个数组:您绝对正确,<代码>列表>代码>不能保证订单。如果您想避免奇怪的事情,您应该考虑将其更改为<代码> SoReDistList @ MarcGrav。非常感谢您提到这一点,在这种情况下,
for
循环可能比
foreach
慢。我想这会让OPs更加困惑,因为他们相信“永远不要使用foreach,它比for慢”。但我只会在需要处理的项目数量巨大时考虑这个论点,如果不是这样的话,我会选择可读性而不是微优化。谢谢,我不知道!我已经删除了我以前的评论。迭代所有项目并搜索每个项目的索引保证会产生n*(n+1)与本页上的其他建议相比,这肯定不是最好的解决方案。我在提供备选方案时提出了与另一个答案相同的解决方案,并指出了其缺点。OP直接询问如何获取任意列表项的索引。这就是您如何做到的。我只是强调,您的备选方案确实是better:)@WayneGore“OP直接询问如何获取任意列表项的索引”-不,他们询问如何获取正在迭代的当前项的索引-不完全相同;他们还用粗体字说:“没有寻找任何东西”@MarcGravel是的,我似乎在那里误述了他的意图。谢谢你的更正。
int index = 0;
foreach (var insT in imoprtati) {
    // your stuff here...


    index++;
}