2016-05-16 61 views
-1

我有一小段代碼要重構。有人寫了投在這樣的風格:Linq例外鑄造

list.OrderBy(u => (int)u.Original).First(); 

有時這種代碼扔無效轉換異常(場Original的類型object的)。

實施例:

list[0].Orginal = 200, 
list[1].Orginal = 85 

一切正常。

list[0].Orginal = 275452, 
list[1].Orginal = 154754 

拋出異常

任何人都知道爲什麼嗎?

+1

爲什麼最初的'object'類型的'Original'?那可能是你應該重構的地方 – Sayse

+0

爲什麼你需要使用cast? – Satpal

+0

另外,除了例子中的錯字,我看不出這些如何拋出異常,你應該嘗試創建一個[mcve]。 – Sayse

回答

2

由於它有時會拋出無效的轉換異常,這意味着您有時在您的列表中有non-int類型的實例。你可以在投射前避開它們,但這並不是我猜想的很好的一種設計。

我會盡我所能地做一個快速修復。

list.Where(u => u.Original is int).OrderBy(u => (int)u.Original).First(); 

然後,我會繼續前進,檢查我缺少什麼如下:

list.Where(u => !(u.Original is int)).ForEach(u => Console.WriteLine(u.Original.GetType())) 

然後修復list提前。

+1

我檢查數據庫模式(此列表來自數據庫過程),並且有人將int更改爲bigint並且不更改此代碼。非常感謝針對性回答。 –

+1

如果現在您可以使用big ints數據庫,則應考慮在代碼中使用long。 – iggymoran

1

正如其他人建議你應該避免不必要的演員。在你的班級中,只需將Orginal的類型從object更改爲int,並且在LINQ查詢中不需要轉換。

+1

但是爲了獲得無效的轉換,某些東西一定不能是整數。 – Sayse

+0

如果列表只是另一個真正包含'object'的列表的過濾版本 - 不同類型的實例? –

+0

你是對的,我看不出他的代碼在哪裏可能會拋出異常... – WPMed

-2

該代碼編譯並運行沒有問題。

https://dotnetfiddle.net/dadrYJ

這些都不是你真正的意思是什麼,你正在尋找

的數據類型是

https://dotnetfiddle.net/ygJTyU

list[0].Orginal = 2147483647; 
list[1].Orginal = 154754; 

其中n> 0

假設。這個錯誤很明顯。

重構:

var value = int.MaxValue + n; 
list[0].Orginal = value; 

重構:

int64 value = int.MaxValue + n; 
list[0].Orginal = value; 

因此:

public int Lambda_OrderBy(Foo u) 
{ 
    return (int) u.Orginal; 
} 

重構:

public int Lambda_OrderBy(Foo u) 
{ 
    int64 value = u.Orginal; 
    return (int) value; // FAIL! 
}