C# 如何访问嵌套列表的键/值?
我正在使用一个名为prime[31]社交网络插件的unity插件来处理Facebook。它适用于以下情况: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
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 };