繁体   English   中英

C# 在 foreach 循环中修改列表项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM