我有一个字典结构如下
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);
答案 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);