2013-04-04 52 views
0

我有對象的列表員工獲得值從對象列表

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

我想在那裏的名稱和ID屬性的條件相匹配的對象。 我一直在使用這種嘗試:

List<Employee> EleList = new List<Employee>(); 
var employee= EleList.Find(sTag => sTag.id == 5b && sTag.name== "lokendra"); 

這是非常耗時,因爲列表大小爲20000-25000。就是它們之間的任何其他方法來檢索結果。請在此引導我。

回答

1

您可以通過使用適當的集合類型,例如加快這一本字典。

如果Employeeid是唯一的,則可以將其用作Dictionary<string, Employee>類型的字典中的鍵。搜索是這樣的:

Employee employee; 
if(dict.TryGetValue("5b", out employee) && employee.name == "lokendra") 
    // employee found 
else 
    // employee not found 

創建字典是這樣的:

dict = EleList.ToDictionary(x => x.id, x => x); 

如果不是唯一的,但是合理的集中(只有少數員工使用相同的ID),您可以將其用作Dictionary<string, List<Employee>>類型的字典中的鍵。搜索是這樣的:

Employee GetEmployee(string id, string name) 
{ 
    List<Employee> employees; 
    if(!dict.TryGetValue(id, out employees)) 
     return null; 
    return employees.FirstOrDefault(x => x.name == name); 
} 

創建字典是這樣的:

dict = EleList.GroupBy(x => x.id) 
       .ToDictionary(x => x.Key, x => x.ToList()); 

請注意:
在這兩種情況下,你應該創建字典只有一次,而不是爲了每一次搜索。所以基本上,而不是EleList你應該有字典。

+0

我有兩個名字和id.So匹配而轉換成字典只有一個參數可以作爲一個key..please幫助我,如果我們能夠使複合鍵.. – 2013-04-04 12:35:42

+0

@lokendrajayaswal:請參閱更新 – 2013-04-04 12:40:10

+0

首先,我必須將Employee轉換爲字典,其中密鑰ID爲 – 2013-04-04 12:45:46

-1

您可以嘗試使用LINQ

yourList.Where(sTag => sTag.id == 5 && string.Equals(sTag.name, "lokendra", StringComparison.OrdinalIgnoreCase)).ToList(); 
+0

-1:LINQ是不是魔術。這將執行相同的 – 2013-04-04 12:32:23

0

出什麼約翰飛碟雙向在他的評論是丹尼爾Hilgarth可能想象

static ILookup<string, Employee> _employeeMap = EleList.ToLookup(x => x.id); 

Employee GetEmployee(string id, string name) 
{ 
    return employeeMap[id].FirstOrDefault(x => x.Name == name); 
} 
+0

@ Firo。我如何使用Lookup在我的情況下,我想匹配的名稱也與id.Please解釋。 – 2013-04-05 10:49:20

+0

請參閱我發佈的方法'GetEmployee'。在那裏,id首先被匹配('[id]')來預過濾名稱搜索的結果('x => x.Name == name')。 – Firo 2013-04-06 09:33:19