替换字典的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);
删除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);