简体   繁体   中英

How to get an Array of items contained in a List

I have to find the names passing through the parameter array in the List with lambda. Should I have to iterate for searching equal names from the array?

 partial class StudentTestScoresProgram
    {
        static public List<Student> GetStudents()
        {
            List<Student> students = new List<Student>
            {
                new Student { Name = "Michael", Scores = new int[] { 94, 92, 91, 91 } },
                new Student { Name = "Isabelle", Scores = new int[] { 66, 87, 65, 93, 86} },
                new Student { Name = "Chastity", Scores = new int[] { 76, 61, 73, 66, 54} },
                new Student { Name = "Chaim", Scores = new int[] { 94, 55, 82, 62, 52} },
                new Student { Name = "Patience", Scores = new int[] { 91, 79, 58, 63, 55} },
                new Student { Name = "Echo", Scores = new int[] { 74, 85, 73, 75, 86} },
                new Student { Name = "Pamela", Scores = new int[] { 73, 64, 53, 72, 68} },
                new Student { Name = "Anne", Scores = new int[] { 78, 96, 52, 79, 60} },
                new Student { Name = "Bruno", Scores = new int[] { 62, 66, 70, 82, 74} },
                new Student { Name = "Tanya", Scores = new int[] { 60, 77, 88, 99, 40} }

 };

            return students;
        }

  /// <summary>
        /// Find a set of students and display their information
        /// 
        /// You MUST use lambda or Predicate/delegate with FindAll for this.
        /// </summary>
        /// <param name="students">list of students</param>
        /// <param name="search">array of student names to find</param>
        static void FindStudents(List<Student> students, params string[] search)
        {
            //I have to fill the code in here. 
            List<Student> subArray = students.FindAll(i => i.Name == search[]); //This is what I was thinking of
        }

I have to fill the code, how can I search for an array?

The program is

 static void Main(string[] args)
        {
            List<Student> students = GetStudents();
            FindStudents(students, "Bruno", "Tanya", "Tony", "Sami");
            FindStudents(students, "Xerxes");
        }

And the output should be like this

Searching for the following students:
Bruno
Tanya
Tony
Sami
Found the following students:
Name: Bruno, Scores: 62, 66, 70, 82
Name: Tanya, Scores: 60, 77, 88, 99
Searching for the following students:
Xerxes
Found the following students:

I am only going to focus on the actual Lambda . Matching the exact output results is up to you

However, you can just use Contains

Determines whether a sequence contains a specified element.

static List<Student> FindStudents(List<Student> students, params string[] search)
    => students.FindAll(i => search.Contains(i.Name));

Or if you want a fast case insensitive search you could use a HashSet with a StringComparer

static void FindStudents(List<Student> students, params string[] search)
{
    var hash = search.ToHashSet(StringComparer.InvariantCultureIgnoreCase);
    return students.FindAll(i => hash.Contains(i.Name));
}

Example

var students = GetStudents();
var results = FindStudents(students, "Pamela", "Anne", "Tony", "Sami");

foreach (var result in results)
   Console.WriteLine($"{result.Name} : {string.Join(",", result.Scores)}");

Output

Pamela : 73,64,53,72,68
Anne : 78,96,52,79,60

Note : These methods lack suitable input checking

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM