C# 如何访问嵌套列表的键/值?

C# 如何访问嵌套列表的键/值?,c#,prime31,C#,Prime31,我正在使用一个名为prime[31]社交网络插件的unity插件来处理Facebook。它适用于以下情况: void onGraph() { Facebook.instance.graphRequest( "me", HTTPVerb.GET, ( error, obj ) => { // if we have an error we dont proceed any further if( error

我正在使用一个名为prime[31]社交网络插件的unity插件来处理Facebook。它适用于以下情况:

void onGraph()
    {
        Facebook.instance.graphRequest( "me", HTTPVerb.GET, ( error, obj ) =>
        {
            // if we have an error we dont proceed any further
            if( error != null )
                return;             
            if( obj == null )
                return;             
            // grab the userId and persist it for later use
            var ht = obj as Dictionary<string,object>;
            _userId = ht["id"].ToString();      

            Debug.Log( "me Graph Request finished: " + _userId );
            Prime31.Utils.logObject( ht );
        } );
    }
 --------- IDictionary --------- 

 --------- IList --------- 
data: 
    --------- IDictionary ---------
    user:    --------- IDictionary ---------
        name:   Mike O'Connor
        id:     ##########
        score:  5677
        application:     --------- IDictionary ---------
            name:   ##########
            namespace:  ##########
            id:     ##########
我似乎可以抓取任何键并将其放入这样的变量中,对吗

_userId = ht["id"].ToString();
但是当我要求每个玩我游戏的人的分数时:

void onGetScore()

    {
        Facebook.instance.graphRequest( "AppID/scores", HTTPVerb.GET, ( error, obj ) =>
        {
            // if we have an error we dont proceed any further
            if( error != null )
                return;

            if( obj == null )
                return;
            // grab the userId and persist it for later use
            var ht = obj as Dictionary<string, object>;
            _score = ht["score"].ToString();
            Prime31.Utils.logObject( ht );
        } );
    }
现在它是嵌套的,所以我不能用这个,对吗

_score = ht["score"].ToString();

如何获取嵌套键?这只是一个语法问题,还是我必须重铸或做其他事情?

您需要更改属性访问逻辑。ht[score]已经不存在了,或者至少不在外部级别,它在字典中,在字典的列表中。相反,它将类似于ht[list1].First[score].ToString,但是我不确定确切的路径是什么,因为您的数据格式不清楚。你能用原始响应更新吗?那我可以肯定地告诉你。此外,我认为您可能需要进行一些迭代。因为结构多次嵌套以获取内部值,所以您必须迭代外部字典,然后迭代它包含的列表,然后访问列表包含的字典中的值。

所以您想访问字典、字典、列表、字典中的键值对的值吗

听起来你想要这个:

_score = ht["data"][0]["score"].ToString();
注意,此处的0表示ht[数据]列表中的第一项

不幸的是,看起来您的对象可能是弱类型的。在这种情况下,您必须执行以下操作:

_score = 
    ((IDictionary<string, object>)
        ((IList<object>)ht["data"])[0])["score"].ToString();
这看起来很糟糕,但是应该假设返回的类型与您描述的是一样的

要获得一组用户名/分数对,您可以使用类似以下Linq查询的方法:

var scores = 
    from item in ((IList<object>)ht["data"]).Cast<IDictionary<string, object>>()
    let name = ((IDictionary<string, object>)item["user"])["name"].ToString()
    let score = item["score"].ToString()
    select new { username = name, score };

你说每个玩我游戏的人的分数。你想要他们所有分数的总和,平均值,第一个玩家的分数,一个包含每个玩家分数的列表,或者其他什么吗?这是一个排行榜,所以我正在寻找一个包含每个用户姓名和分数的列表。你可以在运行时轻松附加Monodevelop,并在出现这些行时设置断点,然后你可以简单地检查你收到的结果,看看你需要如何正确地访问它。第一个不起作用,第二个抛出:KeyNotFoundException:给定的键在字典中不存在。@MikeO'Connor也许我不明白你是如何描述结果对象的。你能把你的问题更新清楚一点吗?首先,谢谢你和我一起工作。原始post中的结果对象直接从xcode调试器复制,减去。这就是你要问的吗?还是你想让我澄清我到底想要什么?首先,我希望能够得到分数并将其填入变量中。最后,我想创建一个用户名/分数列表。@MikeO'Connor将其进一步细分。其中,在不同的语句中执行每个片段,例如var list=IListht[data];var item0=IDictionarylist[0];,请告诉我哪一部分给了你错误。对不起,现在我明白了。这直接来自fb graph API:{data:[{user:{name:,id:},score:0,application:{name:,namespace:,id:}},据我所知,上面的调试日志是原始的。我将行var ht=obj更改为Dictionary;改为var ht=obj;它返回了相同的结果。这就是你要问的吗?@MikeO'Connor没有。我想看看你从FB的API得到的原始响应。我特别是说,对于文本格式,很难读懂结构应该是什么是的。在psgw编辑之后现在更清楚了,但我还是宁愿自己阅读原始数据,然后去哦,这是一个包含列表的字典,列表中的每个项目都是一个字典。我不能提供写入表达式来访问最内部级别的数据,而不知道其结构是什么。顺便说一句,如果你只是在它将引导你朝着正确的方向前进。一步一步地思考。
var scores = 
    from item in ((IList<object>)ht["data"]).Cast<IDictionary<string, object>>()
    let name = ((IDictionary<string, object>)item["user"])["name"].ToString()
    let score = item["score"].ToString()
    select new { username = name, score };