Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字典中删除一项后,如何相应地更改其他键?_C#_Dictionary - Fatal编程技术网

C# 从字典中删除一项后,如何相应地更改其他键?

C# 从字典中删除一项后,如何相应地更改其他键?,c#,dictionary,C#,Dictionary,例如,字典包含: key: 1 2 3 4 5 value: a b c d e 一旦您删除项目b,字典将如下所示 key: 1 3 4 5 value: a c d e 但是我希望钥匙是这样的 key: 1 2 3 4 value: a c d e 有什么方法可以做到这一点吗?您想要的是数组或列表,而不是字典 如果要将其保留为字典,可以将其转换为列表,然后删除条目,然后将其重新转换回字典 var list = new List<string>(); foreac

例如,字典包含:

key:   1 2 3 4 5
value: a b c d e
一旦您删除项目
b
,字典将如下所示

key:   1 3 4 5 
value: a c d e
但是我希望钥匙是这样的

key:   1 2 3 4
value: a c d e

有什么方法可以做到这一点吗?

您想要的是
数组
列表
,而不是字典

如果要将其保留为字典,可以将其转换为列表,然后删除条目,然后将其重新转换回字典

var list = new List<string>();
foreach(var item in dictionary)
{
    list.Add(item.Value);
}
var newDict = new Dictionary<int, string>();
for(int i = 1; i < list.Count + 1; i++)
{
    newDict.Add(i,list[i]);
}
var list=newlist();
foreach(字典中的变量项)
{
列表.添加(项.值);
}
var newDict=新字典();
对于(int i=1;i

但是不要这样做。

正如其他人所说,这不是正确的方法。然而,这是可能的。还有一种方法:

public static void Test()
{
    var foo = new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" }, { 4, "d" }, { 5, "e" } };

    RemoveItemByKey(ref foo, 3);
    RemoveItemByValue(ref foo, "a");

    foreach (var kvp in foo)
    {
        Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
    }

    // Output:
    // 1: b
    // 2: d
    // 3: e
}

public static void RemoveItemByValue(ref Dictionary<int, string> dictionary, string valueToRemove)
{
    foreach (var kvp in dictionary.Where(item=>item.Value.Equals(valueToRemove)).ToList())
    {
        RemoveItemByKey(ref dictionary, kvp.Key);
    }
}

public static void RemoveItemByKey(ref Dictionary<int, string> dictionary, int keyToRemove)
{           
    if (dictionary.ContainsKey(keyToRemove))
    {
        dictionary.Remove(keyToRemove);

        int startIndex = 1;
        dictionary = dictionary.ToDictionary(keyValuePair => startIndex++, keyValuePair => keyValuePair.Value);
    }
}
公共静态无效测试()
{
var foo=新字典{{1,“a”}、{2,“b”}、{3,“c”}、{4,“d”}、{5,“e”};
RemoveItemByKey(参考foo,3);
RemoveItemByValue(参考文件“a”);
foreach(foo中的var kvp)
{
WriteLine(“{0}:{1}”,kvp.Key,kvp.Value);
}
//输出:
//1:b
//2:d
//3:e
}
public static void removitembyvalue(ref Dictionary Dictionary,string valueToRemove)
{
foreach(dictionary.Where(item=>item.Value.Equals(valueToRemove)).ToList()中的var kvp)
{
RemoveItemByKey(参考字典,kvp.Key);
}
}
公共静态void removitembykey(ref Dictionary Dictionary,int keyToRemove)
{           
if(dictionary.ContainsKey(keyToRemove))
{
字典。删除(按键删除);
int startIndex=1;
dictionary=dictionary.ToDictionary(keyValuePair=>startIndex++,keyValuePair=>keyValuePair.Value);
}
}

我想您需要一个排序列表。字典并不是专门为那些东西编的。字典是一系列成对的值。你问的意思是不要那样对待他们。你需要创建自己的收藏类型。我不知道你为什么需要字典。使用仅包含值的
列表
。键只是索引。因此,如果删除一个项目,则会减少一个项目,因此会减少一个索引。通过索引检索值是一个O(1)操作;因此,您甚至具有与词典相同的性能。您计划如何管理向词典中添加新项?如果您能更具体地描述根本问题,您将得到更好的解决方案。这不是字典的初衷。+1这个建议没那么糟糕(见我上面的评论)。但是,我缺少一个解释。请注意,您可能还需要实现一个“Add item”属性,该属性接受要添加的字符串值,以便获得正确的键。类似于
dictionary.Add(dictionary.Count,newValue)
。但是如果你能更好地描述你的问题,你会得到更好的解决方案!