替换字典C键中的子字符串

时间:2016-11-02 00:47:08

标签: c# dictionary

我有一个字典结构如下

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

4 个答案:

答案 0 :(得分:1)

删除where子句。

首先,只选择NC_前缀项,然后创建一个新词典。

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

答案 1 :(得分:1)

关键碰撞怎么样?当你从键中去掉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); }
} );

答案 2 :(得分:0)

删除'where'过滤器,并进行条件替换。 e.g。

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

(未测试的)

答案 3 :(得分:0)

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

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