Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换列表类型的对象<;对象>;列出<;字符串>;_C#_Casting - Fatal编程技术网

C# 转换列表类型的对象<;对象>;列出<;字符串>;

C# 转换列表类型的对象<;对象>;列出<;字符串>;,c#,casting,C#,Casting,我正在Unity中使用MiniJson解析JSON字符串。现在我有一个值,它是一个字符串列表。虽然我得到了一个对象。对象的基本类型是列表,但实际上它应该是列表。所以我现在做这个: void SetInfo(Dictionary<string,object> info) { Colors = (info["colors"] as List<object>).OfType<string>().ToList(); } void SetInfo(字典信息){

我正在Unity中使用MiniJson解析JSON字符串。现在我有一个值,它是一个字符串列表。虽然我得到了一个对象。对象的基本类型是
列表
,但实际上它应该是
列表
。所以我现在做这个:

void SetInfo(Dictionary<string,object> info) {
    Colors = (info["colors"] as List<object>).OfType<string>().ToList();
}
void SetInfo(字典信息){
颜色=(作为列表的信息[“颜色]).OfType().ToList();
}
字典是我从MiniJson库中得到的。这很好用。虽然看起来有点难看,有很多不必要的演员,我想知道是否有更好的方法来做到这一点。我主要是寻找更干净的代码和更快的执行,因为有很多这样的条目

编辑:我对此不是很清楚。在信息字典中有一组键/值对,值的类型各不相同。我可以很容易地施放,但是info[“colors”]对象就是我遇到问题的对象

因此,当我执行
info[“colors”]
时,我会得到一个
对象
,其中包含一个底层类型
列表
。此列表中的
对象
实际上是
字符串

此外,这里并没有真正的性能问题,因为它在程序开始时只被调用一次,虽然目前有明显的延迟,但我将把它放在它自己的线程上,这样就没有问题了。更快的执行只是出于好奇。

试试这个

(info["colors"] as List<object>).ConvertAll(input => input.ToString());
试试这个

(info["colors"] as List<object>).ConvertAll(input => input.ToString());

您是否考虑过使用和关键字

您是否考虑过使用和关键字

我知道此代码有点过时,但我们都知道它的含义:

    List<object> l = new List<object>();
    List<string> s = new List<string>();
    foreach( var i in l )
        s.Add((string)i);
List l=新列表();
列表s=新列表();
foreach(l中的变量i)
s、 添加((字符串)i);

我知道这个代码有点过时,但我们都知道它的意思:

    List<object> l = new List<object>();
    List<string> s = new List<string>();
    foreach( var i in l )
        s.Add((string)i);
List l=新列表();
列表s=新列表();
foreach(l中的变量i)
s、 添加((字符串)i);


您是否测量了性能并确认存在性能问题?“对象的基本类型是一个列表,但实际上它应该是一个列表”您指的是字典?为什么它不作为
字典发送?@Weyland,我指的是当我执行
信息[“颜色”]
时得到的对象的基本类型@马格纳斯,还有其他价值观。例如,信息[“cmc”]是一个整数。我编辑了我的问题。我才刚刚醒来,我的问题因此而痛苦。我希望现在应该更清楚了。您是否测量了性能并确认存在性能问题?“对象的基本类型是列表,但实际上它应该是列表”您是指字典?为什么不将其作为
字典发送?@Weyland,我指的是当我执行
信息[“颜色”]时得到的对象的基本类型
@马格纳斯,还有其他价值观。例如,信息[“cmc”]是一个整数。我编辑了我的问题。我才刚刚醒来,我的问题因此而痛苦。我希望现在应该更清楚了。对于这个问题,你有什么建议吗?列表(因为它们是类)不能是变量。您可以定义自定义逆变接口
ICustomList
,使其类似于
ICustomList=ICustomList
。但你为什么要这样做,反正它会隐式播放。啊,我想我误解了输入和输出关键字当时是如何工作的。我从未使用过它们,但在我的评论中看到了链接到的页面,认为它们可能会有所帮助。啊,好吧,对不起!对于这个问题,你有什么建议吗?列表(因为它们是类)不能是变量。您可以定义自定义逆变接口
ICustomList
,使其类似于
ICustomList=ICustomList
。但你为什么要这样做,反正它会隐式播放。啊,我想我误解了输入和输出关键字当时是如何工作的。我从未使用过它们,但在我的评论中看到了链接到的页面,认为它们可能会有所帮助。啊,好吧,对不起!这是一个很好的解决方案。虽然几乎一样。是否有理由认为
ConvertAll
优于我的
.OfType().ToList()
;除了只作为一个调用之外,类型为
是一个扩展方法,而不是转换方法,它只返回已经属于指定类型的元素,并且类型为IEnumerable。同时,
ConvertAll
不是一个扩展方法-它是List类的本机方法。您不必将IEnumerable转换为List,您可以根据需要转换每个元素。如果您确定所有项目都是string类型,我认为您还可以安全地使用
colors.Cast()
。这是一个很好的解决方案。虽然几乎一样。是否有理由认为
ConvertAll
优于我的
.OfType().ToList()
;除了只作为一个调用之外,类型为的是一个扩展方法,而不是转换方法,它只返回已经属于指定类型的元素,并且类型为IEnumerable。同时,
ConvertAll
不是一个扩展方法-它是List类的本机方法。您不必将IEnumerable转换为List,您可以根据需要转换每个元素。如果您确定所有项目都是string类型,我认为您还可以安全地使用
colors.Cast()