2011-08-26 70 views
3

我有一個LINQ查詢在VB:問題的總和在c#

Dim ss = _someClassDataSource.Sum(Function(s) TryCast(s, SomeClass).BreakdownCover) 

其中BreakdownCover的類型是string。當我試圖重寫它在C#:

var ss = _someClassDataSource.Sum(s=>s.BreakdownCover); 

我得到異常:

Cannot implicitly convert type 'string' to 'int' 

我該如何處理這個問題呢?

+3

一般來說,如果你首先使用Option Explicit On和Option Strict On來使VB.NET工作,那麼從VB.NET轉換到C#將會非常容易。 – AakashM

+3

然後,如果你知道用這些編程,你可能會首先使用類型安全的語言...... – Blindy

回答

6

使用Int.Parse,如果你正在做VB.NET不投一個字符串爲int

var ss=_someClassDataSource.Sum(s=>int.Parse(s.BreakdownCover)); 

然後用

var ss=_someClassDataSource.Sum(s=>Integer.Parse(s.BreakdownCover)); 

這是爲什麼你不能投字符串爲int:

由於顯式轉換沒有實現......的ToString()是一個通用 方法(在System.Object的實現),如果STRI NG將實現 如果所有其他類需要 ,將最難解決的問題投實現它太...

它可能會更好,不使用Convert.ToInt32(),因爲Convert.ToInt32仍然會返回當字符串爲空時的值,而int.Parse會拋出。 Convert.ToInt32可能會帶來意想不到的結果。也看到這個問題Whats the main difference between int.Parse() and Convert.ToInt32

當然,這是基於@Andy指出的上下文。如果你確定NULL被視爲0,那麼任何一種方法都可以工作。

+0

你可能會爭辯說,使用Convert.ToInt32作爲空字符串將是有益的視爲0而不會導致異常並返回結果。哪一個更好取決於問題的背景。在任何情況下,如果字符串是「abc」,它將炸燬。 –

+0

@你是對的。更新了我的答案。 –

+0

@DingingDavis - 沒問題,最好最好的解決方案是首先在數據庫中使用一個不可爲空的數字字段;-) –

4

您需要將字符串顯式轉換爲int:如果字符串是空

var ss=_someClassDataSource.Sum(s=> Convert.ToInt32(s.BreakdownCover)); 

正如DustinDavis Convert.ToInt32指出將返回一個0。如果你想拋出一個異常,那麼Int32.Parse將是一個更好的選擇。但是,如果該字段接受空值,並且這些值應該被視爲0,那麼這將返回預期的結果。

+0

我認爲在這種情況下用Sum()它可以,但如果它是AVG()。但是,依賴於上下文。好點子。 –