Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在if语句之前初始化对象_C#_Linq_Linq To Excel - Fatal编程技术网

C# 在if语句之前初始化对象

C# 在if语句之前初始化对象,c#,linq,linq-to-excel,C#,Linq,Linq To Excel,在我的程序中,我正在读excel表格,并正在做一些linq选择,效果很好 问题:我试图通过应用If语句进行预选。在每种情况下,if/else都会指定该变量,但编译器看不到这一点。编译器告诉我在动手之前初始化var,但当我尝试初始化时,我失败了,因为我只使用sting、int或double等变量,我可以轻松地在动手之前赋值: //This function takes the downloaded xlsx and makes selection of applicable items var

在我的程序中,我正在读excel表格,并正在做一些linq选择,效果很好

问题:我试图通过应用If语句进行预选。在每种情况下,if/else都会指定该变量,但编译器看不到这一点。编译器告诉我在动手之前初始化var,但当我尝试初始化时,我失败了,因为我只使用sting、int或double等变量,我可以轻松地在动手之前赋值:

//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
}
我在第二个代码段的第5行收到以下错误:

错误CS0266无法隐式转换类型 “System.Linq.IQueryable”到 “LinqToExcel.Query.ExcelQueryable”。明确的 转换已存在。是否缺少转换


我看到三种选择,尽管还有其他选择:

您可以显式声明所需变量的类型,在这种情况下,您可以在每种情况下分别初始化它:

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();
}

此外,您可能希望使用折扣.Any而不是折扣.Count>0,因为您并不真正关心数量。

我看到了三个选项,尽管还有其他选项:

您可以显式声明所需变量的类型,在这种情况下,您可以在每种情况下分别初始化它:

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();
}

此外,您可能希望使用折扣.Any而不是折扣.Count>0,因为您并不真正关心数量。

这就是为什么只有在暗示类型时才应使用var的原因。LINQ语句的结果类型与excel不同。Worksheet@hnefatl我相信这是一样的,因为我可以毫无问题地处理他们两个。。否则,您将在这两个循环中创建一个局部变量。因此,并非所有情况下都会分配变量,而是在每种情况下分配不同的局部变量。这就是编译器抱怨的原因。@hnefatl:不,它不是同一类型-这就是问题所在。错误消息向您显示了所涉及的两种类型。这就是为什么只有在隐含类型时才应该使用var。LINQ语句的结果类型与excel不同。Worksheet@hnefatl我相信这是一样的,因为我可以毫无问题地处理他们两个。。否则,您将在这两个循环中创建一个局部变量。因此,并非所有情况下都会分配变量,而是在每种情况下分配不同的局部变量。这就是编译器抱怨的原因。@hnefatl:不,它不是同一类型-这就是问题所在。错误消息显示了所涉及的两种类型。非常感谢。我选择了解决方案1,因为Excel工作表包含数百个条目,我认为后两个选项可能会浪费大量系统资源。@Julian Bechtold:是什么让你认为其中任何一个更昂贵?他们真的,真的不会。你也可以为我的第二个问题给我一个解决方案,我还没有解决。折扣。当没有项目时,计数>0会给出一个空异常。我想这与折扣不同。有吗?@Julian Bechtold:如果没有任何商品,他们都不应该给你一个空引用例外。听起来你需要单独处理这个部分。第二种解决方案:迭代一个表需要约30秒,如果重复两次,不是30秒吗?我还不太了解背景。但我的理解是,它首先必须复制excel的所有元素,然后才能折扣到iterete。再次抛出它。非常感谢。我选择了解决方案1,因为Excel工作表包含数百个条目,我认为后两个选项可能会浪费大量系统资源。@Julian Bechtold:是什么让你认为其中任何一个更昂贵?他们真的,真的不会。你也可以为我的第二个问题给我一个解决方案,我还没有解决。折扣。当没有项目时,计数>0会给出一个空异常。我想这与折扣不同。有吗?@Julian Bechtold:如果没有任何商品,他们都不应该给你一个空引用例外。听起来你需要单独处理这个部分。第二种解决方案:迭代一个表需要约30秒,如果重复两次,不是30秒吗?我还不太了解背景。但我的理解是,它首先必须复制excel的所有元素,然后再将其丢给iterete。
IQueryable<LinqToExcel.Row> discounts = excel.Worksheet();
if (onlyAcceptDiscountedItems)
{
    discounts = discounts.Where(s => s["Discount/Premium"].Cast<string>().StartsWith("-"));
}