c#,获取List <t>中当前T的索引

时间:2019-02-05 14:13:14

标签: c# arraylist

我搜索了很多,我可能偶然发现了类似的东西,但是对于c#来说,这对我来说仍然是陌生的。

我想从 List 获取对象 Tline 的当前索引 我知道我可以简单地用一个int迭代。但我不明白为什么或如何获得它作为当前iteam的索引而无需搜索任何内容。

Tline就像

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

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

  class ACCS 
{
    internal void DBwrite(List<Tline> imoprtati)
    {
        OleDbConnection myAccessConn = null;

        string sFld = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string dbName = "EDIM1.mdb";
        dbName = Path.Combine(sFld, dbName);
        string accessConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", dbName);

        string sqlQuery = "INSERT INTO DOTes (`id`,`cd_m`,`cd_d`,`cd_c`,`nume`) values (?,?,?,?,?)";

        myAccessConn = new OleDbConnection(accessConn);
        int i = 2;
         foreach (var insT in imoprtati)
         {
            using (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");

                //  Show current Tline  Index                           ↓↓↓↓↓↓↓
                cmd.Parameters.AddWithValue("@nume", (imoprtati.GetEnumerator().Current)); //trying anything
                cmd.ExecuteNonQuery(); 


                cmd.Connection.Close();
                i++;

            }
         }
    }

}

2 个答案:

答案 0 :(得分:5)

imoprtati.GetEnumerator().Current不起作用,因为您要使用自己的位置(当前位于第一项之前)创建一个单独迭代器。您最好的选择可能是一个简单的计数器:

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


    index++;
}

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

答案 1 :(得分:0)

List.GetEnumerator()。Current将为列表创建一个新的枚举器,然后返回当前的 item ,而不是索引。如您所见,这将无法正常工作。

当List实现IList时,可以使用IndexOf(T item);查找项目从0开始的索引的方法。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ilist-1.indexof?view=netframework-4.7.2#System_Collections_Generic_IList_1_IndexOf__0_

但是,此方法不能保证常数O(1)的性能,因为它必须在列表中进行搜索。更好的替代方法是在您遍历索引时记录索引。

在没有记录索引的情况下,无法在恒定时间内找到列表中任意项目的索引的方法,这就是我的建议。