2013-01-21 8 views
10

Mam listę obiektów pracowniczych. Muszę wybrać tylko dwa obiekty pracownicze między dwoma indeksami (na podstawie zmiennych początkowych i końcowych). Poniższy kod działa dobrze, ale nie jest w LINQ. Jaki jest najlepszy kod LINQ do tego celu?Sposób LINQ do pobierania elementów między dwoma indeksami na liście

Uwaga: szukam Method Chain podejścia

CODE

public static class DatabaseSimulator 
{ 

    public static List<Employee> GetData(string name, int index, int pageSize) 
    { 
     List<Employee> searchResult = new List<Employee>(); 
     List<Employee> employeesSource = SearchEmployees(name); 

     int start = ((index - 1) * pageSize) + 1; 
     int end = (index * pageSize); 
     for (int i = start; i <= end; i++) 
     { 
      if (searchResult != null) 
      { 
       int listCount = employeesSource.Count; 
       for (int x = 0; x < listCount; x++) 
       { 
        if (x == i) 
        { 
         searchResult.Add(employeesSource[x]); 
         break; 
        } 
       } 
      } 
     } 

     return searchResult; 

    } 


    private static List<Employee> SearchEmployees(string name) 
    { 
     List<Employee> employees = GetEmployees(); 
     return employees.Where(r => r.Name == name).ToList(); 
    } 

    private static List<Employee> GetEmployees() 
    { 
     List<Employee> employees = new List<Employee>(); 
     int i = 0; 
     for (i = 0; i <= 100; i++) 
     { 
      Employee emp = new Employee(); 
      emp.EmpID = i; 
      if (i % 2 == 0) 
      { 
       emp.Name = "Divisible by 2"; 
      } 
      else if (i % 3 == 0) 
      { 
       emp.Name = "Divisible by 3"; 
      } 
      else if (i % 5 == 0) 
      { 
       emp.Name = "Divisible by 5"; 
      } 
      else if (i % 7 == 0) 
      { 
       emp.Name = "Divisible by 7"; 
      } 
      else 
      { 
       emp.Name = "Other -- "+ i.ToString(); 
      } 

      employees.Add(emp); 
     } 

     return employees; 
    } 

} 

Client

List<Employee> searchResult = DatabaseSimulator.GetData("Divisible by 2", 2, 2); 
+2

pamiętać, że nie zawsze powinny tworzyć nowe list z 'ToList' (np. w' SearchEmployees') po połączeniu tych metod. To bardzo nieefektywne. Zamiast tego po prostu zwróć zapytanie i na końcu wywołaj "ToList". –

+0

@TimSchmelter Czy chcesz zwrócić 'IEnumerable' zamiast' List'? – Lijo

+1

Tak. W takim przypadku lepiej byłoby zapewnić przeciążenie 'SearchEmployees' za pomocą/bez indeksu początkowego i końcowego). –

Odpowiedz

36

Można wykorzystać list.Skip(startIndex).Take(endIndex - startIndex) konstrukt.

Gdzie

startIndex: jest indeksem pierwszej elementu, aby wybrać

endIndex: jest i indeksem ostatniego pozycji wybrać

+5

Czy nie powinno to być "Take (endIndex - startIndex + 1)"? – Lijo

+2

@Lijo: to zależy od tego, czy chcesz również uwzględnić elementy krawędzi. Uzasadnione pytanie może również brzmieć: * nie powinno to być (startIndex + 1)? *. – Tigran

+0

Podążając za string.substring, powinno być tak, jak mówi lijo. W każdym razie jest to niesamowite. Dzięki – Gaspa79

Powiązane problemy