替换字典的Keys中的子字符串

本文关键字:字符串 Keys 字典 替换 | 更新日期: 2023-09-27 18:16:04

我有一个如下的字典结构

Dictionary<string, ObjectData> groups=new Dictionary<string, ObjectData>();
groups.add("NC_Test1",new ObjectData());
groups.add("NC_Test2",new ObjectData());
groups.add("Test3",new ObjectData());
groups.add("NC_Test4",new ObjectData());
groups.add("Test5",new ObjectData());
groups.add("NC_Test6",new ObjectData());

我现在想从字典键中删除NC_。所以我把结果看成组:

("Test1",new ObjectData()),
("Test2",new ObjectData()),
("Test3",new ObjectData()),
("Test4",new ObjectData()),
("Test5",new ObjectData()),
("Test6",new ObjectData())

我正在尝试如下,但我只得到以NC_开头的项目。我知道这是因为where从句。不确定如何形成lambda表达式。

groups = groups.Where(x => x.Key.StartsWith("NC_")).ToDictionary(x => x.Key.Replace("NC_", ""), y => y.Value);

替换字典的Keys中的子字符串

删除where子句

首先只选择以NC_为前缀的项,然后创建一个新字典。

groups = groups.ToDictionary(x => x.Key.Replace("NC_", string.Empty), y => y.Value);

键碰撞呢?当你从钥匙上去掉NC_时。考虑一下在原始字典中是否有NC_Test1和Test1。

Lambda操作符也有其用途,但在您的情况下,您将得到一个神秘的结果,无法调试代码并查看哪些项导致异常。对于任何不重要的事情,我通常首先编写详细的版本,一旦它们被调试和测试,然后将它们压缩为lambda操作。

下面的lambda示例通过覆盖冲突键的值来处理冲突。也许你想要忽略碰撞并将它们分开存储。

Dictionary<string, ObjectData> groups = new Dictionary<string, ObjectData>();
groups.Add("NC_Test1", new ObjectData());
groups.Add("NC_Test2", new ObjectData());
groups.Add("Test3", new ObjectData());
groups.Add("NC_Test4", new ObjectData());
groups.Add("Test5", new ObjectData());
groups.Add("NC_Test6", new ObjectData());
Dictionary<string, ObjectData> groupsclustered = new Dictionary<string, ObjectData>();
groups.ToList().ForEach( x => {
    string newKey;
    newKey = x.Key.StartsWith(@"NC_") ? x.Key.Substring(3) : x.Key;
    if (groupsclustered.ContainsKey(newKey))
    { groupsclustered[newKey] = x.Value; } else { groupsclustered.Add(newKey, x.Value); }
} );

删除'where'过滤器,并执行条件替换。例如

groups = groups.ToDictionary(x => x.Key.StartsWith("NC_")? x.Key.Replace("NC_", "") : x.Key, y => y.Value);

(未测试)

Where是不必要的,因为当你想做的只是1对1转换时,你正在任意限制你的输入。一个简单的ToDictionary就足够了:

groups = groups.ToDictionary(k => k.Key.Replace("NC_", ""), v => v.Value);