Могу ли я объявить переменную Global Inferred в C #? - PullRequest
2 голосов
/ 14 января 2009

Мне нужно объявить переменную запроса вне оператора switch таким образом, чтобы у меня была только одна переменная, которая обработала бы другой результат запроса LINQ. Пожалуйста, смотрите код ниже. Проблема здесь в том, что я не могу вывести переменную без ее инициализации

var query;

Switch(filter)
{

case 1:
    var query = from c in Customers 
                where c.Type equals == 'ABC'
                select c; 
     break;
case 2:
    var query = from c in Customers
                where c.Type equals == 'CDE'
                select c;
     break;
 }

foreach(var custrow in query)
{
    //Do Logic
}

}

Ответы [ 4 ]

5 голосов
/ 14 января 2009

Вы, вероятно, хотите IEnumerable<Customer> или IQueryable<Customer> вместо var.

2 голосов
/ 14 января 2009

Нет, поскольку они должны быть инициализированы одновременно с объявлением, компилятор не знает, какой тип присвоить переменной.

Я думаю, вы бы хотели что-то вроде.

IQueryable<Customers> query;

при условии, что запрос возвращает IQueryable of Customers.

Общий дизайн примерно так может быть лучше.

IQueryable<Customers> query;

Switch(filter)
{

case 1:
    query = Customers.Where(c => c.Type == "ABC");
    break;
case 2:
    query = Customers.Where(c => c.Type == "CDE");
    break;
}

foreach(var custrow in query)
{
    //Do Logic
}
0 голосов
/ 14 января 2009

Помимо соглашения со Скоттом, Натаном и Джоном, я хотел бы отметить, что, возможно, было бы неплохо немного изменить этот аспект. Рекомендуется, чтобы функции выполняли только одно:

private IEnumerable<Customer> FetchCustomers(FilterType filter)
{
    switch (filter)
    {
       // Switch logic comes here
    }
}

private void ProcessCustomers(IEnumerable<Customer> customers)
{
    foreach (var customer in customers)
    {
       // Process logic comes here
    }
}

private void FetchAndProcessCustomers(FilterType filter)
{
    ProcessCustomers(FetchCustomers(filter));
}

Теперь это выглядит намного приятнее и проще, и в качестве бонуса ваша проблема с выведенными переменными просто исчезла!

0 голосов
/ 14 января 2009

Ненавижу указывать на это, но это:

var query;

Не компилируется. Предполагаемые переменные должны быть назначены немедленно.

Я согласен с приведенными выше ответами. Вам нужно объявить его как IEnumerable<Customer> или IQueryable<Customer>, чтобы он работал.

...