从集合强制转换为对象与使用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]的对象类型。

从集合强制转换为对象与使用foreach

这两个代码段做的是完全不同的事情。

在第一个例子中,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);             
     }
}