Pass int array in where clause of LINQ Query

13,940

Solution 1

If you are looking to find those students from the list whose id's are present in the ids array then:

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

Solution 2

try

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

Solution 3

I think the answers already given will be fast enough, but just in case after testing you find that it's too slow: You can try converting the student list to a dictionary before doing the searching.

You should only use this after careful timing tests, since it is likely to be a lot slower for most cases!

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;
}
Share:
13,940
ankur
Author by

ankur

Updated on June 17, 2022

Comments

  • ankur
    ankur over 1 year

    There is a class

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

    a method

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

    I want to write a method that takes an int array as input and returns a List

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

    Any help in writing the query. Thank you all for Answers, I am also looking for maintain the performances with large list of records ?? It will be great if you can add me simple explanation of the query will work internally ??

  • ankur
    ankur over 10 years
    Can you explain me how this will work internally ,like will it hamper performance in case of large list??
  • Matthew Watson
    Matthew Watson over 10 years
    Looks like it would be O(N*M) where N = student count, M = ID count. But you can't do much better, I think.
  • Habib
    Habib over 10 years
    @ankur, LINQ internally uses iteration, so it will check against each student id against the id array. This is useful when interacting with the database, since that will create a Select * from table where ID in (1,2,3) kind of query. More details on wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql
  • JustAnotherUserYouMayKnow
    JustAnotherUserYouMayKnow over 10 years
    Unfortunately it won't be executed on the database in this case, as "studentList" is a List and not an IQueryable.
  • Habib
    Habib over 10 years
    @JustAnotherUserYouMayKnow, yes that is in the question
  • snowYetis
    snowYetis over 5 years
    Am I the only one that cannot use Contains on any sort of INT, SHORT, LONG, etc... Just strings, unless it is IQueryable. It wasn't mention in the question...