Exemple #1
0
        static void Main(string[] args)
        {
            var films = new List <Film>
            {
                new Film {
                    Name = "Jaws", Year = 1975
                },
                new Film {
                    Name = "Singing in the Rain", Year = 1952
                },
                new Film {
                    Name = "Some like it Hot", Year = 1959
                },
                new Film {
                    Name = "The Wizard of Oz", Year = 1939
                },
                new Film {
                    Name = "It’s a Wonderful Life", Year = 1946
                },
                new Film {
                    Name = "American Beauty", Year = 1999
                },
                new Film {
                    Name = "High Fidelity", Year = 2000
                },
                new Film {
                    Name = "The Usual Suspects", Year = 1995
                }
            };

            //Создание многократно используемого делегата для вывода списка на консоль
            Action <Film> print = film => Console.WriteLine($"Name={film.Name}, Year={film.Year}");

            //Вывод на консоль исходного списка
            films.ForEach(print);

            //Создание и вывод отфильтрованного списка
            films.FindAll(film => film.Year < 1960).ForEach(print);

            //Сортировка исходного списка
            films.Sort((f1, f2) => f1.Name.CompareTo(f2.Name));
            //or
            films.OrderBy(film => film.Name);

            {
                // OrderByDescending, Skip, SkipWhile, Take, TakeWhile, Select, Concat
                int[] n = { 1, 3, 5, 6, 3, 6, 7, 8, 45, 3, 7, 6 };

                IEnumerable <int> res;
                res = n.OrderByDescending(g => g).Skip(3);
                res = n.OrderByDescending(g => g).Take(3);
                res = n.Select(g => g * 2);
                // to delete from array number 45
                res = n.TakeWhile(g => g != 45).Concat(n.SkipWhile(s => s != 45).Skip(1));
            }

            {
                //Дана последовательность непустых строк.
                //Объединить все строки в одну.
                List <string> str = new List <string> {
                    "1qwerty", "cqwertyc", "cqwe", "c"
                };
                string amount = str.Aggregate <string>((x, y) => x + y);
            }

            {
                //LinqBegin3. Дано целое число L (> 0) и строковая последовательность A.
                //Вывести последнюю строку из A, начинающуюся с цифры и имеющую длину L.
                //Если требуемых строк в последовательности A нет, то вывести строку «Not found».
                //Указание.Для обработки ситуации, связанной с отсутствием требуемых строк, использовать операцию ??.

                int           length = 8;
                List <string> str    = new List <string> {
                    "1qwerty", "2qwerty", "7qwe"
                };
                string res = str.FirstOrDefault(x => (Char.IsDigit(x[0])) && (x.Length == length)) ?? "Not found";
            }

            {
                //LinqBegin5. Дан символ С и строковая последовательность A.
                //Найти количество элементов A, которые содержат более одного символа и при этом начинаются и оканчиваются символом C.

                char          c   = 'c';
                List <string> str = new List <string> {
                    "1qwerty", "cqwertyc", "cqwe", "c"
                };
                int amount = str.Count(x => (x.StartsWith(c.ToString())) && (x.EndsWith(c.ToString())) && (x.Length > 1));
            }

            {
                //LinqBegin6. Дана строковая последовательность.
                //Найти сумму длин всех строк, входящих в данную последовательность.
                //TODO
                string        substr = "qwe";
                List <string> str    = new List <string> {
                    "1qwerty", "cqowertyc", "cqwe", "c"
                };
                int amount = str.FindAll(x => (x.Contains(substr))).Sum(x => x.Length);
            }

            {
                //LinqBegin11. Дана последовательность непустых строк.
                //Пполучить строку, состоящую из начальных символов всех строк исходной последовательности.
                //TODO
                List <string> str = new List <string> {
                    "1qwerty", "owertyc", "qwe", "c"
                };
                string firstSymbols = str.Aggregate((x, y) => x[0].ToString() + y[0].ToString());
            }

            {
                //LinqBegin30. Дано целое число K (> 0) и целочисленная последовательность A.
                //Найти теоретико-множественную разность двух фрагментов A: первый содержит все четные числа,
                //а второй — все числа с порядковыми номерами, большими K.
                //В полученной последовательности(не содержащей одинаковых элементов) поменять порядок элементов на обратный.
                int k = 5;
                IEnumerable <int> n = new int[] { 12, 88, 1, 3, 5, 4, 6, 6, 2, 5, 8, 9, 0, 90 };
                var res             = n.Where(x => x % 2 == 0).Except(n.Skip(k)).Reverse();
            }

            {
                //LinqBegin22. Дано целое число K (> 0) и строковая последовательность A.
                //Строки последовательности содержат только цифры и заглавные буквы латинского алфавита.
                //Извлечь из A все строки длины K, оканчивающиеся цифрой, отсортировав их по возрастанию.
                //TODO
                int           k = 5;
                List <string> a = new List <string> {
                    "ASD123432", "1AS22", "AA23A", "22111", "8UIO9"
                };
                var result = a.Where(x => x.Length == k && Char.IsDigit(x[k - 1])).OrderBy(x => x);
            }

            {
                //LinqBegin29. Даны целые числа D и K (K > 0) и целочисленная последовательность A.
                //Найти теоретико - множественное объединение двух фрагментов A: первый содержит все элементы до первого элемента,
                //большего D(не включая его), а второй — все элементы, начиная с элемента с порядковым номером K.
                //Полученную последовательность(не содержащую одинаковых элементов) отсортировать по убыванию.
                //TODO
                int d = 6;
                int k = 3;
                var a = new List <int> {
                    1, 5, 6, 7, -4, -1, 0, 2, -6
                };
                var res = a.TakeWhile(x => x <= d).Union(a.Skip(k - 1)).Distinct().OrderByDescending(x => x);
            }

            {
                //LinqBegin34. Дана последовательность положительных целых чисел.
                //Обрабатывая только нечетные числа, получить последовательность их строковых представлений и отсортировать ее по возрастанию.
                IEnumerable <int> n = new int[] { 12, 88, 1, 3, 5, 4, 6, 6, 2, 5, 8, 9, 0, 90 };
                var res             = n.Where(x => x % 2 != 0).Select(x => x.ToString()).OrderBy(x => x);
            }

            {
                //LinqBegin36. Дана последовательность непустых строк.
                //Получить последовательность символов, которая определяется следующим образом:
                //если соответствующая строка исходной последовательности имеет нечетную длину, то в качестве
                //символа берется первый символ этой строки; в противном случае берется последний символ строки.
                //Отсортировать полученные символы по убыванию их кодов.
                //TODO
                IEnumerable <string> n = new List <string> {
                    "asdawdwawdaw", "aisofdi3498gfhasugsj", "adq3wo89ahud", "asda2", "123asd", "h"
                };
                var res = n.Select(x => x.Length % 2 != 0 ? x[0] : x[x.Length - 1]).OrderByDescending(x => x);
            }

            {
                //LinqBegin44. Даны целые числа K1 и K2 и целочисленные последовательности A и B.
                //Получить последовательность, содержащую все числа из A, большие K1, и все числа из B, меньшие K2.
                //Отсортировать полученную последовательность по возрастанию.
                //TODO
                int k1 = 5;
                int k2 = 10;
                var a  = new List <int> {
                    2, 6, 7, 8, 4, 2
                };
                var b = new List <int> {
                    34, 7, 9, 6, 3, 66, 2
                };
                var result = a.Where(x => x > k1).Union(b.Where(x => x < k2)).OrderBy(X => X);
            }
            {
                //LinqBegin46. Даны последовательности положительных целых чисел A и B; все числа в каждой последовательности различны.
                //Найти последовательность всех пар чисел, удовлетворяющих следующим условиям: первый элемент пары принадлежит
                //последовательности A, второй принадлежит B, и оба элемента оканчиваются одной и той же цифрой.
                //Результирующая последовательность называется внутренним объединением последовательностей A и B по ключу,
                //определяемому последними цифрами исходных чисел.
                //Представить найденное объединение в виде последовательности строк, содержащих первый и второй элементы пары,
                //разделенные дефисом, например, «49 - 129».
                IEnumerable <int> n1 = new int[] { 12, 88, 11, 3, 55, 679, 222, 845, 9245 };
                IEnumerable <int> n2 = new int[] { 123, 888, 551, 443, 69, 222, 780 };
                var res = n1.Join(n2, x => x % 10, y => y % 10, (x, y) => x.ToString() + " - " + y.ToString());
            }
            {
                //LinqBegin48.Даны строковые последовательности A и B; все строки в каждой последовательности различны,
                //имеют ненулевую длину и содержат только цифры и заглавные буквы латинского алфавита.
                //Найти внутреннее объединение A и B, каждая пара которого должна содержать строки одинаковой длины.
                //Представить найденное объединение в виде последовательности строк, содержащих первый и второй элементы пары,
                //разделенные двоеточием, например, «AB: CD». Порядок следования пар должен определяться порядком
                //первых элементов пар(по возрастанию), а для равных первых элементов — порядком вторых элементов пар(по убыванию).
                //TODO
                var a = new List <string> {
                    "ASL12", "A4HU", "KLJ21", "LKJSA", "12312"
                };
                var b = new List <string> {
                    "ASD220", "8897H", "DKASFJD9", "2J2JK", "997HH"
                };
                var res = a.Join(b, x => x.Length, y => y.Length, (x, y) => x + ": " + y)
                          .OrderBy(x => x.Split(new char[] { ':' }, 1))
                          .ThenBy(x => x.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[1]);
            }

            {
                //LinqBegin56. Дана целочисленная последовательность A.
                //Сгруппировать элементы последовательности A, оканчивающиеся одной и той же цифрой, и на основе этой группировки
                //получить последовательность строк вида «D: S», где D — ключ группировки (т.е.некоторая цифра, которой оканчивается
                //хотя бы одно из чисел последовательности A), а S — сумма всех чисел из A, которые оканчиваются цифрой D.
                //Полученную последовательность упорядочить по возрастанию ключей.
                //Указание.Использовать метод GroupBy.
                IEnumerable <int> n   = new int[] { 12, 88, 11, 3, 55, 679, 222, 845, 9245 };
                List <string>     res = new List <string>();

                IEnumerable <IGrouping <int, int> > groups = n.GroupBy(x => x % 10).OrderBy(x => x.Key);

                foreach (IGrouping <int, int> group in groups)
                {
                    string listElement  = group.Key.ToString();
                    int    summaryValue = 0;

                    foreach (int item in group)
                    {
                        summaryValue += item;
                    }

                    listElement = listElement + ": " + summaryValue.ToString();
                    res.Add(listElement);
                }

                {
                    //LinqObj17. Исходная последовательность содержит сведения об абитуриентах. Каждый элемент последовательности
                    //включает следующие поля: < Номер школы > < Год поступления > < Фамилия >
                    //Для каждого года, присутствующего в исходных данных, вывести число различных школ, которые окончили абитуриенты,
                    //поступившие в этом году (вначале указывать число школ, затем год).
                    //Сведения о каждом годе выводить на новой строке и упорядочивать по возрастанию числа школ,
                    //а для совпадающих чисел — по возрастанию номера года.
                    //TODO


                    var student1 = new Student {
                        School = 9, Year = 1999, Surname = "Pupkin"
                    };
                    var student2 = new Student {
                        School = 4, Year = 1998, Surname = "Petrov"
                    };
                    var student3 = new Student {
                        School = 3, Year = 1999, Surname = "Ivanov"
                    };
                    var student4 = new Student {
                        School = 4, Year = 1998, Surname = "Sidorov"
                    };
                    var student5 = new Student {
                        School = 5, Year = 1999, Surname = "Mironov"
                    };
                    var student6 = new Student {
                        School = 4, Year = 1997, Surname = "Nikonov"
                    };
                    var student7 = new Student {
                        School = 7, Year = 1998, Surname = "Kulikov"
                    };
                    var student8 = new Student {
                        School = 4, Year = 1999, Surname = "Menshikov"
                    };
                    var student9 = new Student {
                        School = 9, Year = 1997, Surname = "Bliadze"
                    };
                    var student10 = new Student {
                        School = 3, Year = 1999, Surname = "Andrijash"
                    };

                    var students = new Student[] { student1, student2, student3, student4, student5, student6, student7, student8, student9, student10 };

                    var groups = students.GroupBy(x => x.Year);
                    var res    = groups.Select(x => new { SchoolCount = x.Distinct().Count(), Year = x.Key }).OrderBy(x => x.SchoolCount).ThenBy(x => x.Year);
                    foreach (var pair in res)
                    {
                        Console.WriteLine($"{pair.SchoolCount} - {pair.Year}");
                    }
                }
            }
        }