使用foreach从集合中转换为对象

时间:2013-04-22 17:13:37

标签: c#

我对这两个陈述之间的区别感到有些困惑。

这个工作并打印出属性结果就好了。

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]对象类型。

3 个答案:

答案 0 :(得分:3)

这两个片段完全不同。

在第一个示例中,result.Properties[key]是某种类型的集合(IEnumerable)。它循环遍历集合中的每个对象,并将该对象的字符串表示形式(ToString())打印到屏幕上。

在第二个例子中,它只是打印集合本身的字符串表示,通常只是类型的名称。
注意:您几乎不希望ToString包含集合的内容。

答案 1 :(得分:1)

不同之处在于,即使property在第一个示例中是object类型,实际属性仍然具有用于ToString()的基础类型。您只是使用object类型来保存更多派生类型。

在第二个示例中,您将其强制转换为类型object,您告诉编译器“我不关心该属性的实际类型,请将其视为object,以便它结束使用object.ToString()代替property.ToString()

答案 2 :(得分:0)

属性是一个对象,具有属性名称,每个属性名称是一组值。 所以... result.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);             
     }
}