Инициализируйте объект перед оператором 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с учетом того, что вы на самом деле не заботитесь о графе.

Другие вопросы по тегам