大写C#KeyValuePairs系列中的所有键

时间:2016-02-18 00:57:31

标签: c# json json.net keyvaluepair

我有一个JSON对象列表,每个对象我都在迭代,我只想处理其中的所有KeyValuePairs,以便键是大写的,然后返回修改后的对象。

这就是我的尝试:

 public static List<JObject> normalizeKeys(List<JObject> jObjList)
    {
        jObjList.ForEach(jobj => {
            foreach(var kvp in jobj)
            {
                kvp.Key = kvp.Key.ToUpper();
            }
        });

        return jObjList;

    }

但它没有执行,而是我得到KeyValuePair<string, JToken>.Key cannot be assigned to -- it is readonly.有没有人对如何完成我所追求的事情有任何建议?

2 个答案:

答案 0 :(得分:9)

虽然给定的答案有效,但我倾向于说它既没有尽可能优雅,也没有尽可能普遍有用。我们可以做到更多。首先,解决一个对象的问题:

var newList = oldList.Select(x=>NormalizeKeys(x)).ToList();

现在要解决列表问题:

var newList = oldList.Select(NormalizeKeys).ToList();

或者,甚至更短:

InstrumentationRegistry.getContext()

是不是比所有嵌套循环内容更令人愉快?说说明如何规范化一个对象,然后说你要将该功能应用到列表中,然后就完成了。

答案 1 :(得分:2)

猜猜你自己知道答案,你必须创建一个新的集合并复制这些项目,因为密钥是密钥,它区分大小写,并且不能更改,否则你最终可能会有2套数据,一组是正常情况,另一组是大写。

解决方案如下:

public static List<JObject> normalizeKeys(List<JObject> jObjList)
{
    // create a new list for return and copy over the existing items
    var jObjReturnList = new List<JObject>(jObjList.Count);
    jObjList.ForEach(jobj =>
    {
        var jObjNew = new JObject();
        foreach (var kvp in jobj)
        {
            jObjNew.Add(kvp.Key.ToUpper(), kvp.Value);
        }

        jObjReturnList.Add(jObjNew);
    });

    return jObjReturnList;
}