Инициализируйте объект перед оператором if
В моей программе я читаю в листе Excel и делаю некоторые выборы linq, которые работали хорошо.
Проблема: я попытался сделать предварительный выбор, применив оператор If. Переменная будет присваиваться в каждом случае (если / еще), но компилятор этого не видит. Компилятор говорит мне инициализировать var prehands, но когда я пытаюсь это сделать, у меня не получается, потому что я привык только к переменным типа 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 второго codenippet:
Ошибка CS0266 Невозможно неявно преобразовать тип 'System.Linq.IQueryable' в 'LinqToExcel.Query.ExcelQueryable'. Существует явное преобразование (вам не хватает приведения?)
1 ответ
Я вижу три варианта, хотя есть и другие:
Вы можете явно объявить тип переменной, которую вы хотите, и в этом случае вы можете инициализировать ее отдельно в каждом случае:
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
с учетом того, что вы на самом деле не заботитесь о графе.