从集合强制转换为对象与使用foreach
本文关键字:foreach 对象 集合 转换 | 更新日期: 2023-09-27 18:10:34
我对这两个语句的区别有点困惑。
这个可以正常工作并打印出属性结果。
foreach( string key in result.Properties.PropertyNames )
{
foreach( object property in result.Properties[key] )
{
Console.WriteLine("{0}:{1}", key, property.ToString());
}
}
和以下内容不起作用。我认为通过将特定属性转换为对象,它将是相同的事情,但显然不是:
foreach( string key in result.Properties.PropertyNames )
{
if( key == "name" )
{
Console.WriteLine("{0}:{1}", key, ((object)(result.Properties[key])).ToString() );
}
}
我得到的是result.Properties[key]
的对象类型。
这两个代码段做的是完全不同的事情。
在第一个例子中,result.Properties[key]
是某种排序的集合(IEnumerable
)。它循环遍历集合中的每个对象,并将该对象(ToString()
)的字符串表示形式打印到屏幕上。
在第二个例子中,它只是打印集合本身的字符串表示形式,通常只是类型的名称。
ToString
包含集合的内容。区别在于,尽管在第一个示例中property
是类型object
,但实际属性仍然具有用于ToString()
的底层类型。您只是使用object
类型来保存更派生的类型。
在第二个例子中,你将它强制转换为类型object
,你告诉编译器"我不在乎属性实际上是什么类型,把它当作object
对待,所以它最终使用object.ToString()
而不是property.ToString()
。
Properties是一个具有属性名的对象,每个属性名对应一组值。所以…结果。Properties[key]将返回一个ResultPropertyValueCollection,其中包含一个或多个值。
你可以像在你的第一段代码中那样枚举这些值。
在第二个示例中,您希望显示此集合中的所有值。这可以很容易地用LINQ完成。为了更好地理解,我将代码分开,但它可以写成一行:
foreach( string key in result.Properties.PropertyNames )
{
if( key == "name" )
{
IEnumerable collection = result.Properties[key];
string[] seperateValues = collection.Cast<object>().Select(o => o.ToString()).ToArray();
string joinedValues = String.Join(", ", seperateValues)
Console.WriteLine("{0}:{1}", key, joinedValues);
}
}