2013-01-21 9 views
10

मेरे पास कर्मचारी ऑब्जेक्ट्स की सूची है। मुझे दो इंडेक्स (प्रारंभ और अंत चर के आधार पर) के बीच केवल दो कर्मचारी ऑब्जेक्ट्स चुनने की आवश्यकता है। निम्नलिखित कोड ठीक काम करता है लेकिन यह LINQ में नहीं है। इस उद्देश्य के लिए सबसे अच्छा LINQ कोड क्या है?सूची में दो इंडेक्स के बीच आइटम प्राप्त करने के लिए LINQ तरीका

नोट: मैं Method Chain दृष्टिकोण

कोड

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

} 

ग्राहक

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

ध्यान दें कि आप हमेशा नए नहीं बनाना चाहिए जब आप इन विधियों को श्रृंखलाबद्ध करते हैं तो 'ToList' (' खोज कर्मचारी 'में फ़ीड) के साथ सूचियां। वह बहुत अक्षम है। इसके बजाय बस क्वेरी वापस करें और अंत में 'ToList' को कॉल करें। –

+0

@TimSchmelter क्या आपका मतलब है कि मुझे 'सूची' के बजाय 'IENumerable' वापस करने की आवश्यकता है? – Lijo

+1

हां। इस मामले में 'खोज कर्मचारी' के अधिभार/स्टार्ट- और एंड-इंडेक्स के बिना अधिभार प्रदान करना बेहतर होगा)। –

उत्तर

36

आप list.Skip(startIndex).Take(endIndex - startIndex) निर्माण का उपयोग कर सकते के लिए देख रहा हूँ।

कहाँ

startIndex: पहले आइटम के एक सूचकांक

endIndex चयन करने के लिए है: है और पिछले आइटम के सूचकांक का चयन करने के

+5

क्या यह 'टेक (एंड इंडेक्स - स्टार्ट इंडेक्स + 1)' नहीं होना चाहिए? – Lijo

+2

@ लिजो: यह इस बात पर निर्भर करता है कि आप किनारे तत्वों को भी शामिल करना चाहते हैं। वैध सवाल भी हो सकता है: * यह नहीं होना चाहिए (startIndex + 1)? *। – Tigran

+0

स्ट्रिंग.substring के बाद यह लिजो के रूप में होना चाहिए। किसी भी मामले में यह कमाल है। धन्यवाद – Gaspa79