コード例 #1
0
        static void Main(string[] args)
        {
            /*
             1. StringBuilder.Substring

                Implement an extension method Substring(int index, int length) for the class StringBuilder that returns new StringBuilder and has the same functionality as Substring in the class String.

            */

            Console.WriteLine("\n1. " + new string('-', 76) + "\n");
            StringBuilder p = new StringBuilder();
            p.Append("Homework: Extension-Methods-Delegates-Lambda-LINQ");
            p = p.Substring(9,17);
            Console.WriteLine(p.ToString());

            /*
             2. IEnumerable extensions

                Implement a set of extension methods for IEnumerable<T> that implement the following group functions: sum, product, min, max, average.

            */
            Console.WriteLine("\n2. " + new string('-', 76) + "\n");

            List<int> numbers = new List<int>();
            numbers.Add(1);
            numbers.Add(1);
            numbers.Add(1);
            numbers.Add(50);
            Console.WriteLine("Sum of the elements : " + numbers.Sum());
            Console.WriteLine("Product of the elements: " + numbers.Product());
            Console.WriteLine("The min element is: " + numbers.Min());
            Console.WriteLine("The max element is: " + numbers.Max());
            Console.WriteLine("The average is : " + numbers.Average());

            /*
             3. First before last

                Write a method that from a given array of students finds all students whose first name is before its last name alphabetically.
                Use LINQ query operators.

            */
            Console.WriteLine("\n3. " + new string('-', 76) + "\n");

            var arrWithSudents = new []{
                new Student("Dragan", "Petrov"),
                new Student("Ivan", "Petrov"),
                new Student("Dragan", "Aski"),
                new Student("Silvena", "Stanislavova")
            };

            var firstBeforeLast = Student.FirstBeforeLast(arrWithSudents);
            Console.WriteLine("Students that first name is before their's last name alphabeticly:");
            foreach(var student in firstBeforeLast)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             4. Age range

                Write a LINQ query that finds the first name and last name of all students with age between 18 and 24.

            */
            Console.WriteLine("\n4. " + new string('-', 76) + "\n");

            var arrWithSudentsAndAge = new[]{
                new Student("Dragan", "Petrov" , 17),
                new Student("Ivan", "Petrov", 21),
                new Student("Dragan", "Aski", 23),
                new Student("Silvena", "Stanislavova", 24)
            };

            var ageBetween = Student.AgeRange(arrWithSudentsAndAge);
            Console.WriteLine("Students that are beween 18 and 24 years old:");
            foreach (var student in ageBetween)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             5. Order students

                Using the extension methods OrderBy() and ThenBy() with lambda expressions sort the students by first name and last name in descending order.
                Rewrite the same with LINQ.

            */
            Console.WriteLine("\n5. " + new string('-', 76) + "\n");

            var orderStudents = new[]{
                new Student("Dragan", "Petrov"),
                new Student("Ivan", "Petrov"),
                new Student("Dragan", "Aski"),
                new Student("Silvena", "Stanislavova")
            };

            var orderStudentsResult = Student.OrderStudents(orderStudents);
            Console.WriteLine("Students ordered by first name then by last name (descending):");
            foreach (var student in orderStudentsResult)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             6. Divisible by 7 and 3

                    Write a program that prints from given array of integers all numbers that are
                    divisible by 7 and 3. Use the built-in extension methods and lambda expressions. Rewrite the same with LINQ.

            */

            Console.WriteLine("\n6. " + new string('-', 76) + "\n");
            var arr = new int[] { 21, 63, 15, 87, 63, 15, 42 };
            var devisibleBy7And3 = DevisibleBy7And3.DevisibleBy7and3(arr);
            Console.WriteLine("Numbers devisible by 7 and 3: ");
            Console.WriteLine("From: " + string.Join(",",arr));
            Console.WriteLine("Result: " + string.Join(",", devisibleBy7And3));

            /*
             7. Timer

                Using delegates write a class Timer that can execute certain method at each t seconds.

            */

            Console.WriteLine("\n7. " + new string('-', 76) + "\n");
            DelegateTask7 method = new DelegateTask7(Task7Method);
            uint seconds = 5;
            Console.WriteLine("Wait for {0} {1}. \n", seconds,seconds != 1 ? "seconds" : "second");
            Timer newTimer = new Timer(1, method, 5); // -----------------------------------------------------------------
            newTimer.StartTimer();
            Console.WriteLine();

            /*
             9. Student groups

                Create a class Student with properties FirstName, LastName, FN, Tel, Email, Marks (a List), GroupNumber.
                Create a List<Student> with sample students. Select only the students that are from group number 2.
                Use LINQ query. Order the students by FirstName.

            */

            Console.WriteLine("\n9. " + new string('-', 76) + "\n");
            List<Student> studentListTask9 = new List<Student>();
            studentListTask9.Add(new Student("Petkan", "Slavchev", null, null, null, null, null, 2));
            studentListTask9.Add(new Student("Dragan", "Penchev", null, null, null, null, null, 4));
            studentListTask9.Add(new Student("Stamat", "Iordanov", null, null, null, null, null, 1));
            studentListTask9.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            Console.WriteLine("All students: ");
            foreach (var student in studentListTask9)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            var studentsFromGroup2 = Student.SelectFromGroup(studentListTask9, 2);

            Console.WriteLine("\nStudents from group 2: ");
            foreach(var student in studentsFromGroup2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }
            /*
             10. Student groups extensions

                Implement the previous using the same query expressed with extension methods.

            */

            Console.WriteLine("\n10. " + new string('-', 75) + "\n");

            var studentsFromGroup2WithExtension = StudentExtensions.SelectFromGroupExtension(studentListTask9, 2);
            foreach (var student in studentsFromGroup2WithExtension)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            /*
            11. Extract students by email

                Extract all students that have email in abv.bg.
                Use string methods and LINQ.

            */

            Console.WriteLine("\n11. " + new string('-', 75) + "\n");
            List<Student> studentsWithEmail = new List<Student>();
            studentsWithEmail.Add(new Student("Petkan", "Slavchev", null, null, null, "*****@*****.**", null, 2));
            studentsWithEmail.Add(new Student("Dragan", "Penchev", null, null, null, "*****@*****.**", null, 4));
            studentsWithEmail.Add(new Student("Stamat", "Iordanov", null, null, null, "*****@*****.**", null, 1));
            studentsWithEmail.Add(new Student("Katq", "Darinova", null, null, null, "*****@*****.**", null, 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithEmail)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Email);
            }
            Console.WriteLine();
            Console.WriteLine("\nStudents with email in abv.bg :");

            var studentsWithEmailInAbv = Student.ExtractByEmail(studentsWithEmail, "@abv.bg");
            foreach (var student in studentsWithEmailInAbv)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Email);
            }

            /*
                12. Extract students by phone

                   Extract all students with phones in Sofia.
                   Use LINQ.

            */
            Console.WriteLine("\n12. " + new string('-', 75) + "\n");
            List<Student> studentsWithPhone = new List<Student>();
            studentsWithPhone.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", null, 2));
            studentsWithPhone.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", null, 4));
            studentsWithPhone.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", null, 1));
            studentsWithPhone.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", null, 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithPhone)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Tel);
            }

            Console.WriteLine();
            Console.WriteLine("\nStudents with phone in Sofia : ");

            var studentsWithPhoneInSofia = Student.ExtractByPhone(studentsWithPhone, "02");
            foreach (var student in studentsWithPhoneInSofia)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Tel);
            }

            /*
                13. Extract students by marks

                   Select all students that have at least one mark Excellent (6) into a new anonymous class that has properties – FullName and Marks.
                   Use LINQ.

             */

            Console.WriteLine("\n13. " + new string('-', 75) + "\n");
            List<Student> studentsWithMarks = new List<Student>();
            studentsWithMarks.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", new List<double>(new double[] {2,3,4,5}), 2));
            studentsWithMarks.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsWithMarks.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsWithMarks.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithMarks)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }
            var result =
                from student in studentsWithMarks
                where student.Marks.Contains(6)
                select new { FullName = student.FirstName + " " + student.LastName, Marks = student.Marks };
            Console.WriteLine();
            Console.WriteLine("People with excelent mark: ");

            foreach (var student in result)
            {
                Console.WriteLine(student.FullName);
            }

            /*
             14. Extract students with two marks

                 Write down a similar program that extracts the students with exactly two marks "2".
                 Use extension methods.

            */

            Console.WriteLine("\n14. " + new string('-', 75) + "\n");
            List<Student> studentsWith2Marks2 = new List<Student>();
            studentsWith2Marks2.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 4, 5 }), 2));
            studentsWith2Marks2.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsWith2Marks2.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsWith2Marks2.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWith2Marks2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }
            var studentWit2mark2 = StudentExtensions.StudentsWithTwoMarks(studentsWith2Marks2, 2, 2);
            Console.WriteLine();
            Console.WriteLine("People with 2  mark 2 : ");

            foreach (var student in studentWit2mark2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }

            /*
             15. Extract marks

                Extract all Marks of the students that enrolled in 2006. (The students from 2006 have 06 as their 5-th and 6-th digit in the FN).

            */

            Console.WriteLine("\n15. " + new string('-', 75) + "\n");
            List<Student> studentsMarksYear = new List<Student>();
            studentsMarksYear.Add(new Student("Petkan", "Slavchev", null, "110206", "02 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 4, 5 }), 2));
            studentsMarksYear.Add(new Student("Dragan", "Penchev", null, "110202", "022 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsMarksYear.Add(new Student("Stamat", "Iordanov", null, "110221", "02 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsMarksYear.Add(new Student("Katq", "Darinova", null, "110206", "012 15 21 321", "*****@*****.**", new List<double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsMarksYear)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + " "  + student.FN.ToString()+ " "  +  string.Join(", ", student.Marks));
            }
            var studentMarkYear = Student.MarksOfStudentsYear(studentsMarksYear, 2006);
            Console.WriteLine(studentMarkYear);
            Console.WriteLine();
            Console.WriteLine("Students enrolled in 2006 (their marks) : ");
            foreach (var student in studentMarkYear)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }

            /*
             17. Longest string

                Write a program to return the string with maximum length from an array of strings.
                Use LINQ.

            */
            Console.WriteLine("\n17. " + new string('-', 75) + "\n");
            string[] arrWithStrings = new string[]
                {
                    "pesho", "dragan", "brustakurta", "problem"
                };
            Console.WriteLine("Arr with strings: \n" + string.Join(", ", arrWithStrings) + "\n");
            string longest = arrWithStrings.ReturnLongestString<string>();
            Console.WriteLine("The longest string: " + longest);

            /*
             18. Grouped by GroupNumber

                Create a program that extracts all students grouped by GroupNumber and then prints them to the console.
                Use LINQ.

            */
            Console.WriteLine("\n18. " + new string('-', 75) + "\n");

            List<Student> gorupedStudentsByGroup = new List<Student>();
            gorupedStudentsByGroup.Add(new Student("Petkan", "Slavchev", null, null, null, null, null, 2));
            gorupedStudentsByGroup.Add(new Student("Dragan", "Penchev", null, null, null, null, null, 4));
            gorupedStudentsByGroup.Add(new Student("Stamat", "Iordanov", null, null, null, null, null, 1));
            gorupedStudentsByGroup.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            gorupedStudentsByGroup.Add(new Student("Pencho", "Hristov", null, null, null, null, null, 5));
            gorupedStudentsByGroup.Add(new Student("Slaveq", "Pincheva", null, null, null, null, null, 1));
            gorupedStudentsByGroup.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            Console.WriteLine("All students: ");
            foreach (var student in gorupedStudentsByGroup)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            var gorupedStudentsByGroupRslt = Student.OrderStudentsByGroup(gorupedStudentsByGroup);

            Console.WriteLine("\nStudents sordet by groups: ");
            foreach (var group in gorupedStudentsByGroupRslt)
            {
                foreach (var student in group)
                {
                    Console.WriteLine("{0} {1} is in group {2}", student.FirstName, student.LastName, student.GroupNumber);
                }
            }

            /*
                19. Grouped by GroupName extensions

                    Rewrite the previous using extension methods

            */

            Console.WriteLine("\n19. " + new string('-', 75) + "\n");

            gorupedStudentsByGroupRslt = StudentExtensions.GroupName(gorupedStudentsByGroup);

            Console.WriteLine("\nStudents sordet by groups: ");
            foreach (var group in gorupedStudentsByGroupRslt)
            {
                foreach (var student in group)
                {
                    Console.WriteLine("{0} {1} is in group {2}", student.FirstName, student.LastName, student.GroupNumber);
                }
            }
        }
コード例 #2
0
        static void Main(string[] args)
        {
            /*
             * 1. StringBuilder.Substring
             *
             *  Implement an extension method Substring(int index, int length) for the class StringBuilder that returns new StringBuilder and has the same functionality as Substring in the class String.
             *
             */

            Console.WriteLine("\n1. " + new string('-', 76) + "\n");
            StringBuilder p = new StringBuilder();

            p.Append("Homework: Extension-Methods-Delegates-Lambda-LINQ");
            p = p.Substring(9, 17);
            Console.WriteLine(p.ToString());

            /*
             * 2. IEnumerable extensions
             *
             *  Implement a set of extension methods for IEnumerable<T> that implement the following group functions: sum, product, min, max, average.
             *
             */
            Console.WriteLine("\n2. " + new string('-', 76) + "\n");

            List <int> numbers = new List <int>();

            numbers.Add(1);
            numbers.Add(1);
            numbers.Add(1);
            numbers.Add(50);
            Console.WriteLine("Sum of the elements : " + numbers.Sum());
            Console.WriteLine("Product of the elements: " + numbers.Product());
            Console.WriteLine("The min element is: " + numbers.Min());
            Console.WriteLine("The max element is: " + numbers.Max());
            Console.WriteLine("The average is : " + numbers.Average());

            /*
             * 3. First before last
             *
             *  Write a method that from a given array of students finds all students whose first name is before its last name alphabetically.
             *  Use LINQ query operators.
             *
             */
            Console.WriteLine("\n3. " + new string('-', 76) + "\n");

            var arrWithSudents = new [] {
                new Student("Dragan", "Petrov"),
                new Student("Ivan", "Petrov"),
                new Student("Dragan", "Aski"),
                new Student("Silvena", "Stanislavova")
            };

            var firstBeforeLast = Student.FirstBeforeLast(arrWithSudents);

            Console.WriteLine("Students that first name is before their's last name alphabeticly:");
            foreach (var student in firstBeforeLast)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             * 4. Age range
             *
             *  Write a LINQ query that finds the first name and last name of all students with age between 18 and 24.
             *
             */
            Console.WriteLine("\n4. " + new string('-', 76) + "\n");

            var arrWithSudentsAndAge = new[] {
                new Student("Dragan", "Petrov", 17),
                new Student("Ivan", "Petrov", 21),
                new Student("Dragan", "Aski", 23),
                new Student("Silvena", "Stanislavova", 24)
            };

            var ageBetween = Student.AgeRange(arrWithSudentsAndAge);

            Console.WriteLine("Students that are beween 18 and 24 years old:");
            foreach (var student in ageBetween)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             * 5. Order students
             *
             *  Using the extension methods OrderBy() and ThenBy() with lambda expressions sort the students by first name and last name in descending order.
             *  Rewrite the same with LINQ.
             *
             */
            Console.WriteLine("\n5. " + new string('-', 76) + "\n");

            var orderStudents = new[] {
                new Student("Dragan", "Petrov"),
                new Student("Ivan", "Petrov"),
                new Student("Dragan", "Aski"),
                new Student("Silvena", "Stanislavova")
            };

            var orderStudentsResult = Student.OrderStudents(orderStudents);

            Console.WriteLine("Students ordered by first name then by last name (descending):");
            foreach (var student in orderStudentsResult)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName);
            }

            /*
             * 6. Divisible by 7 and 3
             *
             *      Write a program that prints from given array of integers all numbers that are
             *      divisible by 7 and 3. Use the built-in extension methods and lambda expressions. Rewrite the same with LINQ.
             *
             */

            Console.WriteLine("\n6. " + new string('-', 76) + "\n");
            var arr = new int[] { 21, 63, 15, 87, 63, 15, 42 };
            var devisibleBy7And3 = DevisibleBy7And3.DevisibleBy7and3(arr);

            Console.WriteLine("Numbers devisible by 7 and 3: ");
            Console.WriteLine("From: " + string.Join(",", arr));
            Console.WriteLine("Result: " + string.Join(",", devisibleBy7And3));

            /*
             * 7. Timer
             *
             *  Using delegates write a class Timer that can execute certain method at each t seconds.
             *
             */

            Console.WriteLine("\n7. " + new string('-', 76) + "\n");
            DelegateTask7 method  = new DelegateTask7(Task7Method);
            uint          seconds = 5;

            Console.WriteLine("Wait for {0} {1}. \n", seconds, seconds != 1 ? "seconds" : "second");
            Timer newTimer = new Timer(1, method, 5); // -----------------------------------------------------------------

            newTimer.StartTimer();
            Console.WriteLine();

            /*
             * 9. Student groups
             *
             *  Create a class Student with properties FirstName, LastName, FN, Tel, Email, Marks (a List), GroupNumber.
             *  Create a List<Student> with sample students. Select only the students that are from group number 2.
             *  Use LINQ query. Order the students by FirstName.
             *
             */

            Console.WriteLine("\n9. " + new string('-', 76) + "\n");
            List <Student> studentListTask9 = new List <Student>();

            studentListTask9.Add(new Student("Petkan", "Slavchev", null, null, null, null, null, 2));
            studentListTask9.Add(new Student("Dragan", "Penchev", null, null, null, null, null, 4));
            studentListTask9.Add(new Student("Stamat", "Iordanov", null, null, null, null, null, 1));
            studentListTask9.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            Console.WriteLine("All students: ");
            foreach (var student in studentListTask9)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            var studentsFromGroup2 = Student.SelectFromGroup(studentListTask9, 2);

            Console.WriteLine("\nStudents from group 2: ");
            foreach (var student in studentsFromGroup2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            /*
             * 10. Student groups extensions
             *
             *  Implement the previous using the same query expressed with extension methods.
             *
             */

            Console.WriteLine("\n10. " + new string('-', 75) + "\n");

            var studentsFromGroup2WithExtension = StudentExtensions.SelectFromGroupExtension(studentListTask9, 2);

            foreach (var student in studentsFromGroup2WithExtension)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            /*
             * 11. Extract students by email
             *
             *  Extract all students that have email in abv.bg.
             *  Use string methods and LINQ.
             *
             */

            Console.WriteLine("\n11. " + new string('-', 75) + "\n");
            List <Student> studentsWithEmail = new List <Student>();

            studentsWithEmail.Add(new Student("Petkan", "Slavchev", null, null, null, "*****@*****.**", null, 2));
            studentsWithEmail.Add(new Student("Dragan", "Penchev", null, null, null, "*****@*****.**", null, 4));
            studentsWithEmail.Add(new Student("Stamat", "Iordanov", null, null, null, "*****@*****.**", null, 1));
            studentsWithEmail.Add(new Student("Katq", "Darinova", null, null, null, "*****@*****.**", null, 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithEmail)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Email);
            }
            Console.WriteLine();
            Console.WriteLine("\nStudents with email in abv.bg :");

            var studentsWithEmailInAbv = Student.ExtractByEmail(studentsWithEmail, "@abv.bg");

            foreach (var student in studentsWithEmailInAbv)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Email);
            }

            /*
             *  12. Extract students by phone
             *
             *     Extract all students with phones in Sofia.
             *     Use LINQ.
             *
             */
            Console.WriteLine("\n12. " + new string('-', 75) + "\n");
            List <Student> studentsWithPhone = new List <Student>();

            studentsWithPhone.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", null, 2));
            studentsWithPhone.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", null, 4));
            studentsWithPhone.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", null, 1));
            studentsWithPhone.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", null, 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithPhone)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Tel);
            }

            Console.WriteLine();
            Console.WriteLine("\nStudents with phone in Sofia : ");

            var studentsWithPhoneInSofia = Student.ExtractByPhone(studentsWithPhone, "02");

            foreach (var student in studentsWithPhoneInSofia)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.Tel);
            }

            /*
             *  13. Extract students by marks
             *
             *     Select all students that have at least one mark Excellent (6) into a new anonymous class that has properties – FullName and Marks.
             *     Use LINQ.
             *
             */

            Console.WriteLine("\n13. " + new string('-', 75) + "\n");
            List <Student> studentsWithMarks = new List <Student>();

            studentsWithMarks.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));
            studentsWithMarks.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsWithMarks.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsWithMarks.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWithMarks)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }
            var result =
                from student in studentsWithMarks
                where student.Marks.Contains(6)
                select new { FullName = student.FirstName + " " + student.LastName, Marks = student.Marks };

            Console.WriteLine();
            Console.WriteLine("People with excelent mark: ");

            foreach (var student in result)
            {
                Console.WriteLine(student.FullName);
            }

            /*
             * 14. Extract students with two marks
             *
             *   Write down a similar program that extracts the students with exactly two marks "2".
             *   Use extension methods.
             *
             */

            Console.WriteLine("\n14. " + new string('-', 75) + "\n");
            List <Student> studentsWith2Marks2 = new List <Student>();

            studentsWith2Marks2.Add(new Student("Petkan", "Slavchev", null, null, "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));
            studentsWith2Marks2.Add(new Student("Dragan", "Penchev", null, null, "022 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsWith2Marks2.Add(new Student("Stamat", "Iordanov", null, null, "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsWith2Marks2.Add(new Student("Katq", "Darinova", null, null, "012 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsWith2Marks2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }
            var studentWit2mark2 = StudentExtensions.StudentsWithTwoMarks(studentsWith2Marks2, 2, 2);

            Console.WriteLine();
            Console.WriteLine("People with 2  mark 2 : ");

            foreach (var student in studentWit2mark2)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }

            /*
             * 15. Extract marks
             *
             *  Extract all Marks of the students that enrolled in 2006. (The students from 2006 have 06 as their 5-th and 6-th digit in the FN).
             *
             */

            Console.WriteLine("\n15. " + new string('-', 75) + "\n");
            List <Student> studentsMarksYear = new List <Student>();

            studentsMarksYear.Add(new Student("Petkan", "Slavchev", null, "110206", "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));
            studentsMarksYear.Add(new Student("Dragan", "Penchev", null, "110202", "022 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 6, 5 }), 4));
            studentsMarksYear.Add(new Student("Stamat", "Iordanov", null, "110221", "02 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 2, 4, 5 }), 1));
            studentsMarksYear.Add(new Student("Katq", "Darinova", null, "110206", "012 15 21 321", "*****@*****.**", new List <double>(new double[] { 2, 3, 4, 5 }), 2));

            Console.WriteLine("All students: ");
            foreach (var student in studentsMarksYear)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + " " + student.FN.ToString() + " " + string.Join(", ", student.Marks));
            }
            var studentMarkYear = Student.MarksOfStudentsYear(studentsMarksYear, 2006);

            Console.WriteLine(studentMarkYear);
            Console.WriteLine();
            Console.WriteLine("Students enrolled in 2006 (their marks) : ");
            foreach (var student in studentMarkYear)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + string.Join(", ", student.Marks));
            }

            /*
             * 17. Longest string
             *
             *  Write a program to return the string with maximum length from an array of strings.
             *  Use LINQ.
             *
             */
            Console.WriteLine("\n17. " + new string('-', 75) + "\n");
            string[] arrWithStrings = new string[]
            {
                "pesho", "dragan", "brustakurta", "problem"
            };
            Console.WriteLine("Arr with strings: \n" + string.Join(", ", arrWithStrings) + "\n");
            string longest = arrWithStrings.ReturnLongestString <string>();

            Console.WriteLine("The longest string: " + longest);

            /*
             * 18. Grouped by GroupNumber
             *
             *  Create a program that extracts all students grouped by GroupNumber and then prints them to the console.
             *  Use LINQ.
             *
             */
            Console.WriteLine("\n18. " + new string('-', 75) + "\n");

            List <Student> gorupedStudentsByGroup = new List <Student>();

            gorupedStudentsByGroup.Add(new Student("Petkan", "Slavchev", null, null, null, null, null, 2));
            gorupedStudentsByGroup.Add(new Student("Dragan", "Penchev", null, null, null, null, null, 4));
            gorupedStudentsByGroup.Add(new Student("Stamat", "Iordanov", null, null, null, null, null, 1));
            gorupedStudentsByGroup.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            gorupedStudentsByGroup.Add(new Student("Pencho", "Hristov", null, null, null, null, null, 5));
            gorupedStudentsByGroup.Add(new Student("Slaveq", "Pincheva", null, null, null, null, null, 1));
            gorupedStudentsByGroup.Add(new Student("Katq", "Darinova", null, null, null, null, null, 2));
            Console.WriteLine("All students: ");
            foreach (var student in gorupedStudentsByGroup)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + " " + student.GroupNumber);
            }

            var gorupedStudentsByGroupRslt = Student.OrderStudentsByGroup(gorupedStudentsByGroup);

            Console.WriteLine("\nStudents sordet by groups: ");
            foreach (var group in gorupedStudentsByGroupRslt)
            {
                foreach (var student in group)
                {
                    Console.WriteLine("{0} {1} is in group {2}", student.FirstName, student.LastName, student.GroupNumber);
                }
            }

            /*
             *  19. Grouped by GroupName extensions
             *
             *      Rewrite the previous using extension methods
             *
             */

            Console.WriteLine("\n19. " + new string('-', 75) + "\n");

            gorupedStudentsByGroupRslt = StudentExtensions.GroupName(gorupedStudentsByGroup);

            Console.WriteLine("\nStudents sordet by groups: ");
            foreach (var group in gorupedStudentsByGroupRslt)
            {
                foreach (var student in group)
                {
                    Console.WriteLine("{0} {1} is in group {2}", student.FirstName, student.LastName, student.GroupNumber);
                }
            }
        }