2011-03-05 47 views
2

我正在存儲自定義類類型的對象的集合。我已經給出了下面的類型。哪個更好? DataTable.Select()或Linq過濾對象?

public class AnonymousClient 
{ 
    private string ipAddress, city, country, category; 
    private Guid id; 
} 

我可能得到的對象過濾基於城市,國家,類別等。我能想到的兩種方法 -

  1. 在字典存儲它 Dictionary<Guid, AnonymousClient> 和使用Linq過濾 對象。
  2. 將它存儲在DataTable與 多列爲會員 並使用DataTable.Select()至 篩選記錄。

我猜他們都在內部循環。哪一個更快更優雅?任何見解?

+0

http://stackoverflow.com/questions/1422015/datatable-select-vs-linq-select – Orbit 2011-03-05 05:35:45

+0

感謝您的鏈接。雖然我沒有執行Linq To SQL。 – NLV 2011-03-05 05:43:10

+1

你看過[i4o - 索引LINQ](http://i4o.codeplex.com/)嗎? – Ani 2011-03-05 05:55:17

回答

0

使用DataTable會增加相當多的開銷。運行查詢後,運行查詢會更容易,因爲它的代碼已經創建,但運行速度不會很快。

如果你想查找使用項目id您可以使用Dictionary<Guid, AnonymousClient>,如果你只想要過濾的,你可以只使用一個List<AnonymousClient>其他字段中的數據。

最高效的方法是簡單地循環收集並挑選出項目。 LINQ幾乎同樣有效,但它增加了一點點的開銷。另一方面,LINQ代碼變得非常簡單。

實施例使用LINQ擴展方法Where

var companies = clients.Where(c => c.category == "Company"); 
+0

你能想到任何其他數據結構或方法來創建對象集合的方式,我們可以在沒有性能開銷的情況下對其進行過濾嗎? – NLV 2011-03-05 05:52:54

0

我會用第一種方法。但是你真的需要將它們存儲在Dictionary中嗎?你已經擁有了他們的收藏權嗎?你可以使用LINQ來過濾集合本身。

var cityFiltered = from p in AnonymousClientList where p.city == 'London' select p; 

etc ..並建立您的過濾收集。

====== UPDATE ======

下面是用於過濾使用城市更新查詢:

var filtered = (from c in clients where c.Value.city=="London" select c).ToDictionary(x => x.Key, x => x.Value); 

如果你看到的,第一部分主要將返回您的條件的布爾值,而不是您需要的字典對象。通過使用ToDictionary方法,您可以轉換回Dictionary。所以,現在在執行LINQ之後,您將擁有所有AnonymousClient並將城市設置爲倫敦。

+0

AnonymousClient不是一個集合。它是對象類型。我正在存儲AnonymousClient類型的對象的集合。 – NLV 2011-03-05 05:48:27

+0

ee ..我的錯誤..我糾正了它 – 2011-03-05 05:51:11

+0

大多數時候我需要使用唯一ID訪問集合中的對象。因此,最好將它放在字典中,因爲我可以直接使用該對象,而無需使用Linq來做到這一點。 – NLV 2011-03-05 06:01:37