2013-04-22 40 views
0

我對這兩個語句之間的區別有點困惑。從集合中使用foreach轉換爲對象

這一個工程和打印出財產結果就好了。

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]對象類型。

+2

fyi在第二個例子中,你沒有將第二個參數傳遞給WriteLine。 – 2013-04-22 17:17:46

+0

是錯別字..我修好了。不同的電腦上的代碼讓我無法複製粘貼它 – Scott 2013-04-22 17:37:03

回答

3

兩個片段做完全不同的事情。

在第一示例中,result.Properties[key]是某種(IEnumerable)的集合。它循環通過集合中的每個對象和打印該對象的字符串表示(ToString() )出到屏幕上。

在第二個示例中,它只是打印集合本身的字符串表示形式,這通常只是該類型的名稱。
注意:您幾乎不希望ToString包含收集的內容。

+0

theres一些缺少的代碼,但它確實編譯..我遍歷DirectorySearcher的搜索結果。 – Scott 2013-04-22 17:24:36

+1

'((object)(key,result.Properties [key]))'不會被編譯。你不能一次投兩件東西。 – 2013-04-22 17:26:38

+0

你的權利..對不起,我錯過了打字。 – Scott 2013-04-22 17:27:36

1

區別在於,即使property在第一個示例中爲object類型,但實際屬性仍具有用於ToString()的基礎類型。您只是使用object類型來保存更多派生類型。

在第二個例子,在那裏你將它轉換爲類型object你告訴編譯器「我不在乎究竟是類型的財產,就像一個object所以它最終使用object.ToString()代替property.ToString()對待它。

+0

啊!我知道了!謝謝。 – Scott 2013-04-22 17:26:51

+0

但'ToString'是虛擬的,所以變量的類型無關緊要;所有重要的是運行時實際對象的類型。 – Servy 2013-04-22 17:28:03

+0

@Servy的問題是我不明白什麼類型被返回。我認爲這是一個單一的對象返回不是對象的集合。 – Scott 2013-04-23 13:58:13

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);    
    } 
} 
+0

請參閱OP的編輯。需要進行此更改才能編譯代碼,但這是OP從一開始就實際運行的內容,並且不會產生所需的結果。 – Servy 2013-04-22 17:41:12

+0

我在遍歷DirectorySearcher的搜索結果。我以前從未使用過這個庫。我對C#也有點新意,並且想要測試這兩個語句是否相當於查看我是否完全理解了發生了什麼。 – Scott 2013-04-22 17:45:51

+0

@Scott:我糾正並調整了我的答案以滿足您的需求。 – 2013-04-22 18:31:44

相關問題