Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 09:00   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость Снова LINQ C#

Приветствую вас тов. программисты!

В первом классе NameAvtorGod:
указываются: название книги, автор, год издания.
Во втором классе AvtorNomer:
указываются: автор книги и номер автора.

При помощи средств запроса я по имени автора определяю привязку:
номер автора и какие книги, какого года он писал.

И вот собственно все ОК, но еще бы хотелось эти книги сортировать погоду издания при помощи оператора orderby, а я не могу понять, как.
Помогите пожалуйста.

Код:
class NameAvtorGod {
        public string Name { get; set; }
        public string Avtor { get; set; }
        public int God { get; set; }

        public NameAvtorGod(string name, string avtor, int god) {
            Name = name;
            Avtor = avtor;
            God = god;
        }
    }

    class AvtorNomer {
        public string Avtor { get; set; }
        public int Nomer { get; set; }


        public AvtorNomer(string avtor, int nomer) {
            Avtor = avtor;
            Nomer = nomer;
        }
    }


    class Program
    {
        static void Main()
        {
            NameAvtorGod[] nmAvtorGd = { new NameAvtorGod("Евгений Онегин", "Пушкин",1233), 
                                         new NameAvtorGod("Вечера на хуторе близ Диканьки","Гоголь",6534),
                                         new NameAvtorGod("Война и мир","Толстой",7334),
                                         new NameAvtorGod("Борис Годунов","Пушкин",9388),
                                         new NameAvtorGod("Скупой рыцарь","Пушкин",3348),
                                         new NameAvtorGod("Собака","Толстой",6354),
                                         new NameAvtorGod("Пропавшая грамота","Гоголь",1131),
                                         new NameAvtorGod("Мертвые души","Гоголь",9345)
                                       };

            AvtorNomer[] avNomer = { new AvtorNomer("Гоголь",1),
                                     new AvtorNomer("Пушкин",2),
                                     new AvtorNomer("Лермонтов",3),
                                     new AvtorNomer("Толстой",4)
                                   };

            var Zapros = from avtornomer in avNomer
                         join nameavtorgod in nmAvtorGd
                            on avtornomer.Avtor equals nameavtorgod.Avtor
                            into lst //в эту переменную идет все из под join
                         select new { TList = lst, Nomer = avtornomer.Nomer };  
 
            foreach(var n in Zapros){
                Console.WriteLine("Автор № " + n.Nomer + " написал книги:");
   
                foreach (var m in n.TList) 
                    Console.WriteLine(m.Name + ", год издания " + m.God);

                Console.WriteLine();
            }
        }
    }
sir.andrey вне форума Ответить с цитированием
Старый 01.10.2011, 07:19   #2
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
По умолчанию

Помогите пожалуйста!
sir.andrey вне форума Ответить с цитированием
Старый 01.10.2011, 08:28   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, не знаю, поможет Вам мой пример кода или нет..

дело в том, что я абсолютно не знаю LINQ.
поэтому, возможно, я написал крайне криво (и можно сделать это проще и красивее). Ну уж извините, как смог..
(разумеется, предлагаемый код я проверил - он работает)

вариант 1. сортировать исходный массив перед использованием его в выборке:
Код:
            var Zapros = from avtornomer in avNomer
                         join nameavtorgod in (from BookList in nmAvtorGd
                                   orderby BookList.God select BookList).ToArray()                
                            on avtornomer.Avtor equals nameavtorgod.Avtor
                            into lst //в эту переменную идет все из под join
                         select new { TList = lst, AvtName = avtornomer.Avtor,  Nomer = avtornomer.Nomer };  
 
            foreach(var n in Zapros){ 
                Console.WriteLine("Автор № {0} /{1}/  написал книги:", n.Nomer, n.AvtName);
   
                foreach (var m in n.TList) 
                    Console.WriteLine(m.Name + ", год издания " + m.God);

                Console.WriteLine();
            }
            Console.ReadLine();
вариант 2. Сортировать структуру при выдаче на экран (при этом сама структура остаётся несортированной, разумеется)
Код:
            var Zapros = from avtornomer in avNomer
                         join nameavtorgod in nmAvtorGd                
                            on avtornomer.Avtor equals nameavtorgod.Avtor
                            into lst //в эту переменную идет все из под join
                         select new { TList = lst, AvtName = avtornomer.Avtor,  Nomer = avtornomer.Nomer };  
 
            foreach(var n in Zapros){ 
                Console.WriteLine("Автор № {0} /{1}/  написал книги:", n.Nomer, n.AvtName);
   
                foreach (var m in (from L in n.TList orderby L.God select L).ToArray())
                    Console.WriteLine(m.Name + ", год издания " + m.God);

                Console.WriteLine();
            }
            
            Console.ReadLine();
p.s. если Вы в курсе, то LINQ допускает вариант записи через точку чтото.WHere(...).OrderBy(...) и т.д. Мне лично такой вариант больше нравится - как-то он компактней и ближе к синтаксису вызова методов объекта...
например, предложенный выше второй вариант может быть записан так:
Код:
.....
                foreach (var m in n.TList.OrderBy(g => g.God).ToArray())
                    Console.WriteLine(m.Name + ", год издания " + m.God);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.10.2011, 08:55   #4
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Спасибо огромное, супер!!!

Но меня волнует одно, зачем писать ToArray()?
Без него вроде бы все нормально!
Код:
var Zapros = from avtornomer in avNomer
                         join nameavtorgod in
                             (from BookList in nmAvtorGd
                              orderby BookList.God
                              select BookList)//.ToArray()
                            on avtornomer.Avtor equals nameavtorgod.Avtor
                            into lst //в эту переменную идет все из под join
                         select new { TList = lst, AvtName = avtornomer.Avtor, Nomer = avtornomer.Nomer };
sir.andrey вне форума Ответить с цитированием
Старый 01.10.2011, 09:08   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста!

Цитата:
Но меня волнует одно, зачем писать ToArray()?
дык. не пишите!
я же говорю - я про LINQ знаю не больше Вас!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.10.2011, 09:10   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

p.s. если Вы в курсе, то LINQ допускает вариант записи через точку чтото.WHere(...).OrderBy(...) и т.д. Мне лично такой вариант больше нравится - как-то он компактней и ближе к синтаксису вызова методов объекта...
например, предложенный выше второй вариант может быть записан так:
Код:
.....
                foreach (var m in n.TList.OrderBy(g => g.God).ToArray())
                    Console.WriteLine(m.Name + ", год издания " + m.God);
тов. Герберт рекомендует чаще пользоваться синтаксисом запросов.
sir.andrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LINQ C# sir.andrey Помощь студентам 5 29.09.2011 11:52
LINQ to XML iiunbreakableii C# (си шарп) 0 03.08.2011 18:35
LINQ и MySQL nec117 C# (си шарп) 5 13.05.2011 19:54
LINQ + MySQL tavrocotaps Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 20.07.2010 17:21
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24