0

我有

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

                }
            }
4

5 回答 5

11

您无法从字典中获取项目 1,2,3,您只能根据键删除。

字典 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);
        }

但请记住,项目在数组中的顺序是未定义的。你不能确定它

于 2012-09-07T05:34:43.410 回答
1

正如 habib 所说,您不能根据索引从字典中删除项目,您只能根据键删除项目,使用Remove()方法

从这里阅读更多内容-根据值删除字典中的项目

于 2012-09-07T05:37:42.417 回答
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 个”的含义。

于 2012-09-07T05:46:02.120 回答
0

如果dic是“简单” Dictionary,则使用 LINQ,您可以从原始字典创建一个新字典并将其重新分配给dic,如下所示:

dic = dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value);

正如astander在评论和Habib 的回答中指出的那样,字典项目的顺序是未定义的,因此您可能只想将此技术应用于SortedDictionary

在这种情况下,您需要SortedDictionary从 LINQ 结果创建一个新的:

dic = new SortedDictionary<string, List<string>>(
          dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value));
于 2012-09-07T06:01:25.713 回答
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());
于 2012-09-07T05:34:55.460 回答