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)
。但是如果你能更好地描述你的问题,你会得到更好的解决方案!