2013-01-21 12 views
10

Ich habe eine Liste der Mitarbeiter Objekte. Ich muss nur zwei Mitarbeiterobjekte zwischen zwei Indizes auswählen (basierend auf Start- und Endvariablen). Der folgende Code funktioniert einwandfrei, aber nicht in LINQ. Was ist der beste LINQ Code für diesen Zweck?LINQ Weg, um Elemente zwischen zwei Indizes in einer Liste

Hinweis: Ich suche Method Chain Ansatz

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; 
    } 

} 

Kunde

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

Hinweis auszuwählen, die Sie nicht immer wieder neu erstellen sollten Listen mit 'ToList' (zB in' SearchEmployees'), wenn Sie diese Methoden verketten. Das ist sehr ineffizient. Liefern Sie einfach die Abfrage zurück und rufen Sie 'ToList' am Ende auf. –

+0

@TimSchmelter Meinst du ich muss "IEnumerable" anstatt "List" zurückgeben? – Lijo

+1

Ja. In diesem Fall wäre es besser, Überladungen von 'SearchEmployees' mit/ohne Start- und End-Index bereitzustellen. –

Antwort

36

Sie list.Skip(startIndex).Take(endIndex - startIndex) Konstrukt verwenden können.

Wo

startIndex: ein Index der ersten Artikel

wählen

endIndex: ist und der Index der letzten Artikel

+5

Sollte es nicht 'Take (endIndex - startIndex + 1)' sein? – Lijo

+2

@Lijo: Es hängt davon ab, ob Sie auch Kantenelemente einfügen möchten. Die berechtigte Frage könnte auch sein: * sollte es nicht sein (startIndex + 1)? *. – Tigran

+0

Nach dem string.substring sollte es so sein wie lijo sagt. In jedem Fall ist das großartig. Vielen Dank – Gaspa79

Verwandte Themen