2013-04-04 71 views
0

我有一個字符串列表,我想找到特定的值並返回。 如果我只是想找尋我可以用一個HashSet,而不是列表列表查找,Hashset或Linq哪一個更好在列表中

HashSet<string> data = new HashSet<string>();  
bool contains = data.Contains("lokendra"); // 

但對於名單我使用Find,因爲我想也從列表返回值。 我發現這個方法非常耗時。此代碼所在的方法是hit more than 1000 times,列表大小爲appx 20000 to 25000。此方法需要時間。是否有其他方法可以使搜索更快。

List<Employee> employeeData= new List<Employee>(); 
var result = employeeData.Find(element=>element.name=="lokendra") 

我們是否有任何linq或任何其他方法,使得從搜索中更快地檢索數據。 請幫忙。

public struct Employee 
    { 
     public string role; 
     public string id; 
     public int salary; 
     public string name; 
     public string address;   
    } 

我有這種結構的列表,如果名稱屬性值「洛肯德拉」。然後我想retrun整個object.Consider列表作爲員工的數據相匹配。

我想知道我們擁有Hashset以獲得更快搜索的方式,無論如何,我們都可以搜索數據並快​​速返回而不是查找。

+0

你是什麼意思「我想從列表中返回的值」?你知道價值 - 你在檢查它,所以它永遠是「lokendra」。請澄清你的問題。 – 2013-04-04 11:51:24

+0

@Jon Skeet。我想從列表中查找列表是否包含值,或者實際上是否包含對象列表,所以如果名稱屬性匹配,那麼我將返回整個對象。 – 2013-04-04 11:53:58

+0

這完全改變了問題的性質。你的實際情況與你所描述的不符。 – 2013-04-04 11:58:15

回答

0

你可以試用employeeData.FirstOrDefault(e => e == "lokendra"),但它仍然需要迭代收集,所以會有性能列表Find方法。

如果列表的內容只設置一次,然後你再去找它,你又應該考慮實施自己的解決方案:

  • 排序列表第一搜索前
  • 使用二進制搜索(這將是O(log n)的代替爲O(n)標準FindWhere
+0

你是對的MarcinJuraszek ..我嘗試過,但表現相同。 – 2013-04-04 11:56:02

+0

@ MarcinJuraszek.Actually我有對象的列表。如果一個屬性匹配傳遞給它的值,那麼整個對象將被返回。 – 2013-04-04 11:57:32

+0

好的,但是您的列表內容在搜索之間會有變化嗎? – MarcinJuraszek 2013-04-04 11:59:46

3

這聽起來像瓦特帽子你其實想要的是Dictionary<string, Employee>。建立一次,你可以多次有效地查詢它。你可以輕易的員工列表構建它:

var employeesByName = employees.ToDictionary(e => e.Name); 
... 

var employee; 
if (employeesByName.TryGetValue(name, out employee)) 
{ 
    // Yay, found the employee 
} 
else 
{ 
    // Nope, no employee with that name 
} 

編輯:現在,我已經看到了你的編輯... 不要創建struct類型這樣的。你幾乎可以肯定想要一個class,而不是一個具有屬性,而不是公共領域...

+0

我可以同時匹配名稱和ID,因爲可以有兩名員工同名。怎麼做? – 2013-04-04 12:12:41

+0

@lokendrajayaswal:在您完善需求時,我不會繼續更新我的答案。我建議你刪除這個問題,然後問一個新的*所有*你的要求...否則它是毫無意義的。 – 2013-04-04 12:13:20

+0

我試圖刪除this.But不起作用,但是你的第一個回答就足夠我的需求在其他情況下,我想只是檢查列表是否包含表名稱從數據庫。現在是非常快..將問相同的新問題。 – 2013-04-04 12:20:50

相關問題