我可以在C#中声明Global Inferred变量吗?

时间:2009-01-14 04:46:32

标签: c# linq types type-inference

我需要在switch语句之外声明查询变量,因为我只有一个变量可以处理LINQ Query的不同结果。请参阅下面的代码。这里的问题是我无法在不初始化的情况下推断变量

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 个答案:

答案 0 :(得分:5)

您可能需要IEnumerable<Customer>IQueryable<Customer>而不是var。

答案 1 :(得分:2)

不,因为它们必须在声明它们的同时进行初始化,编译器不知道要为变量分配什么类型。

我想你会想要类似的东西。

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
}

答案 2 :(得分:0)

讨厌指出这一点,但是:

var query;

不会编译。需要立即分配推断变量。

我同意上述答案。您需要将其声明为IEnumerable<Customer>IQueryable<Customer>才能生效。

答案 3 :(得分:0)

除了同意Scott,Nathan&amp;乔恩,我想指出,重建这一点可能是一个好主意。保持函数只做一件事总是一个好习惯:

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

现在它看起来更好更简单,作为奖励,关于推断变量的问题就消失了!