【问题标题】:Using IEnumerable with foreach loop in C#在 C# 中将 IEnumerable 与 foreach 循环一起使用
【发布时间】:2017-06-14 16:18:47
【问题描述】:

我正在编写一个 C# 应用程序,它将数据从远程数据库同步到我的 MySQL Web 应用程序,我需要有关如何更好地做到这一点的建议。

在我的 C# 应用程序中,我建立了与远程 MySQL 数据库的连接,并将该连接传递给一个函数,该函数运行一个循环以将每次迭代中的一个查询列表传递给另一个执行每个查询的函数。它的编写方式效果很好,但使用 foreach 循环和 IEnumerable 函数似乎适得其反。我不确定现在的编写方式是否有意义,我想知道是否可以在没有 foreach 循环的情况下编写它,同时保留 IEnumerable 函数(如果可能)。

private void UpdateRecords(MySqlConnection connection) {
    foreach (string query in UpdateQueries(connection, _queries)) { }
}
private IEnumerable<string> UpdateQueries(MySqlConnection connection, List<string> queries) {
    List<string>.Enumerator enumerator = queries.GetEnumerator();
    while (enumerator.MoveNext()) {
        MySqlCommand command = new MySqlCommand();
        command.Connection = connection;
        command.CommandText = enumerator.Current;
        command.ExecuteNonQuery();
        yield return enumerator.Current;
    }
}

编辑:在 UpdateQueries 函数中添加了 4 行来描述此函数中 MySQL 连接的使用。

【问题讨论】:

  • 为什么要将连接传递给UpdateQueries?为什么不放弃这一切,只做foreach (var query in _queries) { }
  • 我不明白 UpdateQueries 的意思,UpdateRecords 代码似乎等同于 foreach (string query in _queries) { /* proccess query */ }
  • @ChrisPickford 我编辑了帖子以说明为什么将连接传递给 UpdateQueries 函数。
  • 我的观点仍然成立;你正在用UpdateQueries 重新发明轮子。请参阅下面的答案,了解如何更好地构建它。
  • @apokryfos 这也是我不确定的。如果没有 foreach,UpdateQueries 函数就不会迭代,我理解这是多余的。我只包含 UpdateQueries 用于学习目的。

标签: c# foreach ienumerator


【解决方案1】:

_queries 本身是可枚举的(因为它是一个List&lt;string&gt; which implements IEnumerable&lt;string&gt;,所以你可以将它重写为:

private void UpdateRecords(MySqlConnection connection) 
{
    foreach (string query in _queries) 
    {
        // process query
    }
}

【讨论】:

  • 感谢@RB 的建议。所以在这种情况下,您是否建议我完全删除所有 IEnumerable 功能,因为 _queries 已经实现了 IEnumerable?我把它放在那里的唯一原因是为了学习目的,但在这种情况下似乎没有多大意义。
  • 是的 - 你可以删除它。如果你有某种集合本身没有实现 IEnumerable,或者你想做一些复杂的事情,比如读取实时生成的传感器数据或其他事情,你只需要实现这样的功能
【解决方案2】:

我不确定您为什么使用Enumerator。你可以foreachList

private IEnumerable<string> UpdateQueries(MySqlConnection connection, List<string> queries)
{
    foreach (var query in queries)
    {
        MySqlCommand command = new MySqlCommand();
        command.Connection = connection;
        command.CommandText = query;
        command.ExecuteNonQuery();
        yield return query;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-06
    • 2022-06-23
    • 1970-01-01
    • 2014-04-20
    • 2011-08-06
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多