2013-03-13 13 views
6

C'è un metodo di una classePasso int matrice in cui la clausola di LINQ Query

Public class Student 
{ 
    int id; 
    int rollNum; 
    String Name; 
} 

Public List<Student> GetAllStudents() 
{ 
    var studentList = GetMeAll(); // Simple select * query to get all students 
    //unfortunately i can't make changes in this method so have to write a linq query to  //filter data. 
    //getting int array ids correctly from some method 
    var filterList = FilterStudentsByID(ids,StudentList); 
} 

Voglio scrivere un metodo che prende un array int come input e restituisce una lista

Public List<Student> FilterStudentsByID(int[] ids,List<student> studentList) 
{ 
    //There should be a linq query , but I am new to linq so don't know how to write this. 
    Var list = from studentList in ..... don't know much; 
} 

Qualsiasi aiuto nella scrittura della query. Grazie a tutti per le risposte, sto anche cercando di mantenere le prestazioni con una grande lista di record ?? Sarebbe bello se tu potessi aggiungermi alla semplice spiegazione della query che funzionerà internamente ??

+0

Ogni studente ha un ID univoco? –

+0

sì sono unici – ankur

+0

Inoltre: la lista degli ID sarà lunga (più del 5% della dimensione della lista degli studenti, per esempio)? Sto solo cercando di capire se vale la pena creare una lista di studenti ordinati per ID prima di fare la ricerca. –

risposta

10

Se stai cercando di trovare quelle studenti della lista il cui id sono presenti nel ids matrice poi:

var list = from s in stundentList 
      where ids.Contains(s.ID) 
      select s; 
+0

Puoi spiegarmi come funzionerà internamente, come se ostacolasse le prestazioni in caso di un elenco di grandi dimensioni ?? – ankur

+0

Sembra che sia O (N * M) dove N = numero studenti, M = numero ID. Ma non puoi fare molto meglio, penso. –

+1

@ankur, LINQ utilizza internamente l'iterazione, quindi verificherà contro ogni id studente contro l'array id. Questo è utile quando si interagisce con il database, dal momento che creerà un 'Seleziona * dalla tabella in cui ID in (1,2,3)' tipo di query. Maggiori dettagli su http://wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/ – Habib

4

provare

Var list = studentList.Where(s=>ids.Contains(s.id)).ToList(); 
1

penso che le risposte già date saranno abbastanza veloce , ma nel caso dopo aver verificato che è troppo lento: puoi provare a convertire l'elenco degli studenti in un dizionario prima di effettuare la ricerca.

Si consiglia di utilizzarlo solo dopo accurati test di temporizzazione, poiché è probabile che sia molto più lento nella maggior parte dei casi!

public static List<Student> FilteredStudents(int[] targetIds) 
{ 
    var allStudents = GetAllStudents().ToDictionary(student => student.id); 
    var result = new List<Student>(); 

    foreach (int id in targetIds) 
    { 
     Student student; 

     if (allStudents.TryGetValue(id, out student)) 
     { 
      result.Add(student); 
     } 
    } 

    return result; 
} 
Problemi correlati