2011-09-27 68 views
5

我有一個叫做產品轉換IEnumerable的<T>串[]

class Product 
{ 
    public Id { get; set; } 
    public Name { get; set; } 
} 

實體和我的所有產品的列表:

IEnumerable<Product> products = _productRepository.GetAll() 

我想從這份名單得到的字符串數組該陣列中將包含產品Id +產品名稱,因此當我嘗試使用以下代碼進行投射時:

string[] s = products.Cast<string>().ToArray(); 

我得到了以下異常:

Unable to cast object of type 'Product' to type 'System.String' 

例外真的讓很多FO李宗紅,所以如果我有對產品對象的方法

string ProductToString(Product p) 
{ 
    return p.Name; 
} 

或覆蓋到的ToString(),所以我怎麼能使用此方法從IEnumerable獲取字符串[]的列表?

回答

20

好,因爲這種方法可以使用:

string[] s = products.Select<string>(ProductToString).ToArray(); 

然而,這將是更地道來通常使用拉姆達表達式來做這個而不是一個單獨的方法:

// Matches ProductToString, but not your description 
string[] s = products.Select(p => p.Name).ToArray(); 

我只會使用一個單獨的方法,如果它將從各個地方調用(確保一致性)或做了很多工作。

編輯:我剛剛注意到你的描述(想要ID +名稱)實際上並不符合你給出的ProductToString方法(它只是給出了名字)。對於ID +名字我會使用:

string[] s = products.Select(p => p.ID + " " + p.Name).ToArray(); 

string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name)) 
        .ToArray(); 

或者你可以改變你的ProductToString方法,當然。

或者,你可以在Product覆蓋ToString(),如果這是通常你想怎麼一個Product轉換爲string。然後,您可以使用方法組轉換或lambda表達式來調用ToString


這有可能是你並不需要顯式地指定類型參數 - 即:

string[] s = products.Select(ProductToString).ToArray(); 

將正常工作 - 在規則類型推斷和方法組轉換總是讓我困惑編譯器行爲隨着時間的推移略有改變。剛纔的一個快速測試看起來像是確實工作,但可能有細微處略微不同情況。

+0

恕我直言,你不必寫下''在那裏,當然你通過30secs打我.... – Carsten

+0

@CarstenKönig:它可能* *取決於哪個版本你正在使用的編譯器。 v4編譯器IIRC有微妙的變化。我在你評論的時候添加了一個關於這個的註釋:) –

2
string[] s = products.Select(p => p.Name).ToArray(); 

或者,如果你需要編號+姓名:

string[] s = products.Select(p => p.Id + ' ' + p.Name).ToArray(); 
1

使用

string[] s = (from p in products select p.Id.ToString() + " " + p.Name.ToString()).ToArray(); 
相關問題