2017-06-14 37 views
-1

我正在寫一個C#應用程序,它將從遠程數據庫中的數據,以我的MySQL的Web應用程序同步,和我需要建議如何做到這更好的foreach循環。使用的IEnumerable在C#

在我的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; 
    } 
} 

編輯:添加4行到UpdateQueries函數描述用在這個函數MySQL連接的。

+1

爲什麼你要將連接傳遞給'UpdateQueries'?爲什麼不只是拋棄整個事情而只是做'foreach(var query in _queries){}'? –

+0

我沒有得到'UpdateQueries'的觀點,'UpdateRecords'代碼看起來就像'foreach(在_queries中的字符串查詢){/ * proccess query * /}' – apokryfos

+0

@ChrisPickford我編輯了帖子以顯示爲什麼連接正在傳遞給UpdateQueries函數。 – hRdCoder

回答

1

_queries本身就是枚舉(因爲它是一個List<string>which implementsIEnumerable<string>,所以你可以重寫這僅僅是:

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

感謝您的建議,@RB。所以在這種情況下,你會建議我完全刪除所有的IEnumerable功能,因爲_queries已經實現IEnumerable ?我在那裏學習的唯一原因是爲了學習目的,但在這種情況下似乎沒有多大意義。 – hRdCoder

+0

是 - 你可以將其刪除。如果你有某種沒有實現IEnumerable本身的集合,或者你想做一些複雜的事情,比如讀取實時生成的傳感器數據, –

0

我不知道爲什麼你正在使用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; 
    } 
}