我有
Dictionary<string, List<string>> Dic = new Dictionary<string, List<string>>();
如何从Dic中删除前1,2,3个元素。我不知道如何使用“foreach”
foreach (KeyValuePair<string, List<string>> kvPair in Dic)
{
Console.WriteLine(kvPair.Key);
foreach (string str in kvPair.Value)
{
}
}
答案 0 :(得分:10)
您无法从字典中获取项目1,2,3,您只能在键的基础上删除。
未定义项目的返回顺序。
您可以使用Orderby根据密钥对字典进行排序。但要从字典中删除项目,您将需要密钥。
编辑:根据您编辑的“foreach”问题
在枚举字典时无法修改字典。如果您尝试从foreach中的字典中删除项目,则会收到错误:
收藏被修改;枚举操作可能无法执行。
您可以将字典转换为数组,然后从字典中删除项目(如下所示,可能会改进或更改,只是为了一个想法):
var dicArrray = Dic.ToArray();
foreach (KeyValuePair<string, List<string>> kvPair in dicArrray)
{
if (kvPair.Key.Equals("1"))
Dic.Remove(kvPair.Key);
}
但请记住,项目在数组中的顺序是未定义的。你无法确定它
答案 1 :(得分:1)
正如habib所说你不能根据索引从字典中删除项目,你只能根据键删除项目,使用删除()方法
从这里阅读更多内容 - Remove Item in Dictionary based on Value
答案 2 :(得分:1)
首先,创建一个要删除的键集合:
var toDelete = new List<string>();
int count = 3;
foreach(var pair in dictionary) {
toDelete.Add(pair.Key);
count -= 1;
if( count==0 ) break;
}
// then when ready - delete
foreach(string key in toDelete) dictionary.Remove(key);
原因不是在枚举时通过删除项来使字典枚举器无效。
还考虑到键对出现的顺序没有在规范中明确设置,因此您可能不会依赖它 - 即使它现在有效,它可能会停止在下一版本的框架中工作。因此,您还必须在创建要删除的元素列表之前确定“前3个”的含义。
答案 3 :(得分:0)
要删除字典中的项目,请使用Remove()方法。例如:
Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
dictionary.Add("1", new List<string());
dictionary.Remove("1");
未维护添加的订单字典元素。但是,如果要删除最高键,例如,请执行以下操作:
dictionary.Remove(dictionary.Keys.OrderBy().First());
答案 4 :(得分:0)
如果dic
是“简单”Dictionary
,则可以使用LINQ从原始字典创建新字典并将其重新分配给dic
,如下所示:
dic = dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value);
正如 astander 在评论和 Habib的答案中指出的那样,字典项的顺序是未定义的,因此您可能希望将此技术应用于{ {3}}仅限。
在这种情况下,您需要从LINQ结果中创建一个新的SortedDictionary
:
dic = new SortedDictionary<string, List<string>>(
dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value));