如果键包含一些子字符串,如何从字典中动态删除键值对?
How to dynamically remove key value pair from a dictionary if the key contains some substring?
我有一个外部循环迭代要在字典中匹配的子字符串数组。在内部循环中,我想遍历字典并删除一个条目,其键包含 substring.How 来执行此操作而不会得到 "Collection was modified Exception"?
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);
}
}
据我所知,你不能。但是,您可以将这些对存储在一个列表中,并在与第一个单独的循环中删除它们。
找到匹配项并删除条目如下
var keysWithMatchingValues = dictionary.Where(d => d.Key.Contains("xyz"))
.Select(kvp => kvp.Key).ToList();
foreach(var key in keysWithMatchingValues)
dictionary.Remove(key);
你需要一个新的 collection:
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-loop 以删除它们。但是因为没有索引器你不能。
只需更新您的内部 foreach
如下:
foreach (var item in _generalWorksheetData.Keys.Where(kvp => kvp.Contains(outerKey)).ToList())
{
_generalWorksheetData.Remove(item);
}
请注意,LINQ 扩展方法 ToList
和 ToArray
允许您修改集合。
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);
}
我有一个外部循环迭代要在字典中匹配的子字符串数组。在内部循环中,我想遍历字典并删除一个条目,其键包含 substring.How 来执行此操作而不会得到 "Collection was modified Exception"?
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);
}
}
据我所知,你不能。但是,您可以将这些对存储在一个列表中,并在与第一个单独的循环中删除它们。
找到匹配项并删除条目如下
var keysWithMatchingValues = dictionary.Where(d => d.Key.Contains("xyz"))
.Select(kvp => kvp.Key).ToList();
foreach(var key in keysWithMatchingValues)
dictionary.Remove(key);
你需要一个新的 collection:
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-loop 以删除它们。但是因为没有索引器你不能。
只需更新您的内部 foreach
如下:
foreach (var item in _generalWorksheetData.Keys.Where(kvp => kvp.Contains(outerKey)).ToList())
{
_generalWorksheetData.Remove(item);
}
请注意,LINQ 扩展方法 ToList
和 ToArray
允许您修改集合。
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);
}