如果键包含某些子字符串,如何从字典中动态删除键值对

本文关键字:字典 动态 键值对 删除 包含某 字符串 如果 | 更新日期: 2023-09-27 18:37:08

我有一个外部循环,迭代要在字典中匹配的子字符串数组。在内部循环中,我想遍历字典并删除其键包含子字符串的条目。如何在不出现"集合被修改异常"的情况下执行此操作?

foreach (string outerKey in new string[] { "PAYERADDR_PAYERNAME", "RECADDR_RECNAME", "PAYERADDR_ADDR", "RECADDR_ADDR" })
{
    foreach (var item in _generalWorksheetData.Where(kvp => kvp.Value.Contains(outerKey)).ToList())
        {
            _generalWorksheetData.Remove(item.Key);
        }
}

如果键包含某些子字符串,如何从字典中动态删除键值对

您需要一个新的集合:

List<string> todelete = dictionary.Keys.Where(k => k.Contains("substring")).ToList();
todelete.ForEach(k => dictionary.Remove(k));

或带foreach

foreach (string key in todelete)
    dictionary.Remove(key);  // safe to delete since it's a different collection

如果Dictionary.Keys实现IList而不仅仅是ICollection您可以在向后 for 循环中访问它以删除它们。但由于没有索引器,因此不能。

AFAIK,你不能。但是,您可以将这些对存储在列表中,并在与第一个对不同的循环中删除它们。

只需更新您的内部foreach,如下所示:

foreach (var item in _generalWorksheetData.Keys.Where(kvp => kvp.Contains(outerKey)).ToList())
   {
      _generalWorksheetData.Remove(item);
   }

请注意,LINQ 扩展方法ToListToArray允许您修改集合。

        List<string> sampleList = new List<string>();
        sampleList.Add("1");
        sampleList.Add("2");
        sampleList.Add("3");
        sampleList.Add("4");
        sampleList.Add("5");
        // Will not work
        foreach (string item in sampleList)
        {
            sampleList.Remove(item);
        }
        // Will work
        foreach (string item in sampleList.ToList())
        {
            sampleList.Remove(item);
        }

查找匹配项并删除条目,如下所示

var keysWithMatchingValues = dictionary.Where(d => d.Key.Contains("xyz"))
                               .Select(kvp => kvp.Key).ToList();
foreach(var key in keysWithMatchingValues)
    dictionary.Remove(key);