2013-04-04 7 views
0

У меня есть список объектов EmployeeПолучить значение из списка объектов

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

Я хочу, чтобы получить объект, где имя и свойство идентификатора соответствует условию. Я попытался с помощью этого:

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

Это довольно много времени, потому что размер списка между 20000-25000 .а есть ли другой способ, чтобы получить результат. Пожалуйста, помогите мне в этом.

ответ

1

Вы можете ускорить этот процесс, используя соответствующий тип коллекции, например, словарь.

Если id из Employee уникален, вы можете использовать его в качестве ключа в словаре по типу 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); 

Если он не уникален, но достаточно сосредоточены (только несколько сотрудников с тем же идентификатором), вы можете использовать его как ключ в словаре типа 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 при преобразовании в словарь только один параметр может использоваться в качестве ключа. Пожалуйста, помогите мне, если мы сможем создать составной ключ. –

+0

@lokendrajayaswal: см. Обновление –

+0

Сначала мне нужно преобразовать Employee в словарь, где ключевой идентификатор id. –

-1

Вы можете попробовать использовать Linq

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

-1: LINQ не магия. Это будет выполнять то же самое –

0

показывая, что Джон Скит в своих комментариях к 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); 
} 
+0

@ Firo. Как использовать Lookup в моем случае, когда я хочу совместить имя вместе с id.Пожалуйста, объясните. –

+0

см. Метод 'GetEmployee', который я разместил. Там идентификатор сначала сопоставляется ('[id]'), чтобы предварительно фильтровать результаты, которые ищутся по имени ('x => x.Name == name'). – Firo

Смежные вопросы