2017-08-15 78 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()”有什么不同? –