从对象列表中获取值

时间:2013-04-04 12:26:10

标签: linq list c#-3.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之间。还有其他方法可以检索结果。请指导我。

3 个答案:

答案 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();