我有一个对象列表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
之间。还有其他方法可以检索结果。请指导我。
答案 0 :(得分:1)
您可以使用适当的收集类型加快速度,例如:字典。
如果id
的{{1}}是唯一的,您可以将其用作Employee
类型字典中的键。搜索看起来像这样:
Dictionary<string, Employee>
创建字典将如下所示:
Employee employee;
if(dict.TryGetValue("5b", out employee) && employee.name == "lokendra")
// employee found
else
// employee not found
如果它不是唯一但合理集中(只有少数具有相同ID的员工),则可以将其用作类型dict = EleList.ToDictionary(x => x.id, x => x);
的字典中的键。搜索看起来像这样:
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());
。
答案 1 :(得分: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);
}
答案 2 :(得分:-1)
您可以尝试使用Linq
yourList.Where(sTag => sTag.id == 5 && string.Equals(sTag.name, "lokendra", StringComparison.OrdinalIgnoreCase)).ToList();