我搜索了很多,我可能偶然发现了类似的东西,但是对于c#来说,这对我来说仍然是陌生的。
我想从 List
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++;
}
}
}
}
答案 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开始的索引的方法。
但是,此方法不能保证常数O(1)的性能,因为它必须在列表中进行搜索。更好的替代方法是在您遍历索引时记录索引。
在没有记录索引的情况下,无法在恒定时间内找到列表中任意项目的索引的方法,这就是我的建议。