2009-01-14 67 views
2

我需要在switch語句之外聲明查詢變量,這樣我只有一個變量可以處理LINQ查詢的不同結果。請參閱下面的代碼。這裏的問題是,我不能沒有初始化它我可以在C#中聲明一個全局推斷變量嗎?

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 
} 

} 

回答

5

你可能想IEnumerable<Customer>IQueryable<Customer>,而不是VAR推斷的變量。

2

不,因爲它們必須在聲明的同時進行初始化,編譯器不知道分配給變量的類型。

我想你會想要的東西。

IQueryable<Customers> query; 

假設查詢返回IQueryable的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

恨指出這一點,但是,這樣的:

var query; 

不會編譯。推斷的變量需要立即分配。

我同意上面的答案。您需要聲明它爲IEnumerable<Customer>IQueryable<Customer>才能正常工作。

0

除了同意斯科特,內森&喬恩,我想指出,也許這是一個好主意,重構這一點點。它始終是一個很好的做法,以保持功能做的只有一件事:

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

現在看起來更漂亮,更簡單,並作爲獎金,只是走了你就推斷變量的問題!

相關問題