2012-01-05 24 views
4

我想知道LINQ泛型集合的方式。如何使用LINQ查詢泛型集合

我的Customer類是

class Customer 
    { 
     public string Name { get; set; } 
     public string id { get; set; } 
    } 

我的集合類是

class genericCollection<T> : CollectionBase 
{ 
    public void add(T GenericObject) 
    { 
     this.List.Add(GenericObject); 
    } 
} 

然後我一些數據添加到客戶收集

genericCollection<Customer> customers = new genericCollection<Customer>(); 
    customers.add(new Customer {id= "1",Name="Andy"}); 

    customers.add(new Customer { id = "2", Name = "MArk" }); 
    customers.add(new Customer { id = "3", Name = "Jason" }); 
    customers.add(new Customer { id = "4", Name = "Alex" }); 

現在我可以通過客戶迭代對象使用一個foreach循環,但我怎麼能linq它。

我想使用類似

var query = from c in customers 
      select c; 

但我不能夠成功地投放。

問候, 審計局

+0

你爲什麼使用自定義集合? – 2012-01-05 11:29:21

+0

你有什麼建議?無論如何,我正在嘗試這個作爲LINQ的測試飛行員。 – user1131926 2012-01-05 11:43:25

+3

我建議使用列表類而不是自定義集合。 – 2012-01-05 11:49:48

回答

3

一些答案建議使用customers.OfType<Customer>;這會在轉換它之前測試集合中每個對象的類型。你知道每個對象都是這種類型的,所以你不需要運行時類型檢查。因此,您應該使用customers.Cast<Customer>

話雖如此,我同意最好不要首先使用CollectionBase;使用泛型集合類型會更好;如果您更喜歡定義自己的集合類型,那麼您應該從(或委託)泛型集合中派生出來。

5

嘗試查詢更改爲以下(假設你CollectionBase工具IEnumerable):

var query = from c in customers.OfType<Customer>() select c; 

,或者讓你的genericCollection<T>實施IEnumerable<T>

+0

謝謝@ Tobias.I嘗試過這種類型,但忘了放圓括號。 – user1131926 2012-01-05 11:28:36

+0

@ user1131926因爲'customers'中的所有對象都被稱爲「Customer」類型,所以在客戶中使用'from c會更加高效.Cast ()select c' – phoog 2012-01-05 15:07:59

1

您需要實現IEnumerable<T>界面:

public class genericCollection<T>: CollectionBase, IEnumerable<T>{} 
+0

但是,如果不使用IEnumerable var query = from c in customers.OfType () 其中c.Name ==「Mark」 select c; – user1131926 2012-01-05 11:34:13

2

LINQ標準查詢運算符是爲IEnumerableIEnumerable<T>定義的擴展方法。你可以嘗試:

class genericCollection<T> : Collection<T> 

或如List<T>

1

的問題是,你從CollectionBase獲得使用其他集合類型。你也應該執行ICollection<T>,不再需要強制轉換。

1

可以在LINQ查詢指定類型:

var query = from Customer c in customers select c; 

或實施IEnumerable<T>用於如:

class genericCollection<T> : CollectionBase, IEnumerable<T> 
{ 
    public void add(T GenericObject) 
    { 
     this.List.Add(GenericObject); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return this.List.Cast<T>().GetEnumerator(); 
    } 
} 
+0

謝謝Lolo.Just實施IEnumerator.Thanks所有的幫助 – user1131926 2012-01-05 11:46:07