[英]C# Modify List item while in a foreach loop
正如标题所说,我正在尝试编辑foreach
循环内的列表项。 我知道这是不可能的,所以我正在寻求解决方案来解决这个问题。
由于这是直接从 MySQL 服务器获取数据,因此需要在此循环内完成并使用正确的索引。 我尝试使用第二个列表并更改 foreach 循环之外的数据,但这并没有考虑到项目的索引位置。
foreach (string friend in friendsOnline)
{
query = "SELECT `username` FROM `accounts` WHERE email = '" + friend + "'";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
for (int i = 0; i<friendsOnline.Count; i++)
{
if (friendsOnline[i].Contains(friend))
{
friendsOnline[i] = rdr[0].ToString();
}
}
}
}
正如我所看到的,您在friendsOnline
有电子邮件:
string[] friendsOnline = new[] {
"Me@Shire.com",
"Dark.Lord@Mordor.gov",
};
并且您想将这些电子邮件更改为名称:
string[] friendsOnline = new[] {
"Frodo Baggins",
"Sauron the Black",
};
首先,我建议只执行一次查询:SQL 太慢,不能循环运行; 相反,您可以构建一个字典,其中电子邮件对应于哪些索引:
using System.Linq;
...
// eMail - indexes correspondence
Dictionary<string, int[]> dict = friendsOnline
.Select((name, index) => (name : name, index : index))
.GroupBy(pair => pair.name, pair => pair.index, StringComparer.OrdinalIgnoreCase)
.ToDictionary(group => group.Key, group => group.ToArray());
// We take all users (no WHERE), but once
// We read both username and email
string sql =
@"SELECT `username`,
`email`
FROM `accounts`";
//DONE: using - we should Dispose IDisposable Command and Reader
using cmd = new MySqlCommand(sql, conn);
using rdr = cmd.ExecuteReader();
while (rdr.Read()) {
string name = Convert.ToString(rdr[0]);
string mail = Convert.ToString(rdr[1]);
// If we have correspondent indexes, we change friendsOnline
if (dict.TryGetValue(mail, out var indexes))
foreach (var index in indexes)
friendsOnline[index] = name;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.