0

我有一个对象列表 Employee

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

我想获取 name 和 id 属性与条件匹配的对象。我试过用这个:

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

这非常耗时,因为列表大小介于20000-25000. 是否有任何其他方法可以检索结果。请指导我。

4

3 回答 3

1

您可以通过使用适当的集合类型(例如字典)来加快这一速度。

如果 的idEmployee唯一的,您可以将其用作类型字典中的键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你应该有字典。

于 2013-04-04T12:33:08.330 回答
0

展示 John Skeet 在对 Daniel 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);
}
于 2013-04-05T09:13:43.290 回答
-1

您可以尝试使用 Linq

yourList.Where(sTag => sTag.id == 5 && string.Equals(sTag.name, "lokendra", StringComparison.OrdinalIgnoreCase)).ToList();
于 2013-04-04T12:31:50.310 回答