2017-08-15 77 views
1

在我的程序中我正在閱讀一個excel表格,並且正在做一些linq選擇,這很好。在if語句之前初始化一個對象

問題:我試圖通過應用If語句進行預選。變量將在每種情況下分配(if/else),但編譯器沒有看到。編譯器告訴我初始化VAR beforehands但是當我嘗試,我失敗了,因爲我只用像刺痛,int或double,我可以輕鬆地分配beforehands變量:

//This function takes the downloaded xlsx and makes selection of applicable items 

var excel = new ExcelQueryFactory("list.xlsx"); 
//get all items with discount 
if (onlyAcceptDiscountedItems == true) 
{ 
    var discounts = from s in excel.Worksheet() 
        where s["Discount/Premium"].Cast<string>().StartsWith("-") 
        select s; 
} 
else 
{ 
    var discounts = excel.Worksheet(); 
} 
if (discounts.Count() != 0) 
{ 
    //some application logic comes here 
} 

當我試圖做到這一點這樣的:

var excel = new ExcelQueryFactory("list.xlsx");ter code here 
var discounts = excel.Worksheet(); 
if (onlyAcceptDiscountedItems == true) 
{ 
    discounts = from s in excel.Worksheet() 
       where s["Discount/Premium"].Cast<string>().StartsWith("-") 
       select s; 
} 
if (discounts.Count() != 0) 
{ 
    //some application logic comes here 
} 

我收到以下錯誤在第二codesnippet的第5行:

錯誤CS0266無法隱式轉換類型 'System.Linq.IQueryable' 到 'LinqToExcel.Query.ExcelQueryable'。一個明確的 轉換不存在(是否缺少強制轉換?)

+3

這就是爲什麼'var'應該只在暗示類型時才使用。你的LINQ語句的結果與'excel.Worksheet()'不一樣的類型。 – maccettura

+0

@hnefatl我相信它是一樣的,因爲我可以在沒有任何問題的情況下使用它們。 –

+1

在你的第一個'if .. else'循環中,你正在創建一個局部變量。因此_「變量將在所有情況下分配」_不是真的 - 在每種情況下分配一個**不同的**局部變量。這就是編譯器抱怨的原因。 – stuartd

回答

7

我看到三個選項,雖然也有其他人:

你可以明確地聲明你想要的變量類型,在這種情況下,你可以初始化它分別在每種情況下:

IQueryable<LinqToExcel.Row> discounts; 
if (onlyAcceptDiscountedItems == true) 
{ 
    discounts = from s in excel.Worksheet() 
       where s["Discount/Premium"].Cast<string>().StartsWith("-") 
       select s; 
} 
else 
{ 
    discounts = excel.Worksheet(); 
} 

您可以使用條件運算符來初始化變量:

var discounts = onlyAcceptDiscountedItems 
    ? excel.Worksheet().Where(s => s["Discount/Premium"].Cast<string>().StartsWith("-")) 
    : excel.Worksheet(); 

你可以刪除調用excel.Worksheet的冗餘在兩個地方:

IQueryable<LinqToExcel.Row> discounts = excel.Worksheet(); 
if (onlyAcceptDiscountedItems) 
{ 
    discounts = discounts.Where(s => s["Discount/Premium"].Cast<string>().StartsWith("-")); 
} 

此外,您可能需要使用discounts.Any()代替discounts.Count() > 0,因爲你真的不關心計數。

+0

非常感謝。我選擇瞭解決方案1,因爲excelsheet包含幾十萬個條目,我認爲後面的兩個選項可能會浪費很多系統資源。 –

+1

@JulianBechtold:是什麼讓你覺得他們中的任何一個都更昂貴?他們真的,真的不會。 –

+0

你可能也給了我一個解決方案,我的第二個問題,我還沒有工作。當沒有項目時,discounts.Count()> 0將給出一個空例外。我猜這與「discounts.Any()」有什麼不同? –