2013-04-04 46 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