2013-01-21 7 views
10

Ho Elenco di oggetti Dipendente. Devo selezionare solo due oggetti dipendenti tra due indici (basati su variabili iniziali e finali). Il seguente codice funziona bene ma non è in LINQ. Qual è il miglior codice LINQ per questo scopo?LINQ modo per ottenere elementi tra due indici in un elenco

Nota: Sto cercando Method Chain approccio

CODICE

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

Nota che non si deve creare sempre nuove elenca con 'ToList' (es. in' SearchEmployees') quando si concatenano questi metodi. Questo è molto inefficiente. Invece basta restituire la query e chiamare 'ToList' alla fine. –

+0

@TimSchmelter Vuoi dire che devo restituire 'IEnumerable' piuttosto che' List'? – Lijo

+1

Sì. In questo caso sarebbe meglio fornire sovraccarichi di 'SearchEmployees' con/senza l'indice di inizio e di fine). –

risposta

36

È possibile utilizzare list.Skip(startIndex).Take(endIndex - startIndex) costrutto.

Dove

startIndex: è un indice del primo voce per selezionare

endIndex: e 'un indice dell'ultimo voce per selezionare

+5

Non dovrebbe essere 'Take (endIndex - startIndex + 1)'? – Lijo

+2

@Lijo: dipende se vuoi includere anche gli elementi del bordo. La domanda legittima potrebbe anche essere: * non dovrebbe essere (startIndex + 1)? *. – Tigran

+0

Seguendo il modo string.substring dovrebbe essere come dice lijo. In ogni caso è fantastico. Grazie – Gaspa79

Problemi correlati