如何从Dictionary中删除项目

时间:2012-09-07 05:31:44

标签: c# .net-framework-version

我有

   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)
                {

                }
            }

5 个答案:

答案 0 :(得分:10)

您无法从字典中获取项目1,2,3,您只能在键的基础上删除。

Dictionary MSDN

  

未定义项目的返回顺序。

您可以使用Orderby根据密钥对字典进行排序。但要从字典中删除项目,您将需要密钥。

请参阅Dictionary.Remove

编辑:根据您编辑的“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));