Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос по LINQ / 11 сообщений из 11, страница 1 из 1
20.01.2010, 11:11
    #36419857
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Помогите, плиз с LINQ...
есть список классов:

авторclass record
{
Date Date1;
int Num;
}

List<record> records = new List<record>();
Мне нужно найти число, соответствует максимальной дате, но не больше заданной.

Сейчас я это сделал так:

авторvar rec = from a in records
where a.Date1 <= date
select new { a.Date1, a.Num };

if (rec.Count() > 0)
{
var maxDate = rec.Max(p => p.Date1);
var recMax = rec.First(p => p.Date1 == maxDate);
result = recMax.Num;
}

Вопрос: может быть эту задачу можно решить как-то проще? Мне кажется, что у меня слишко мудреный код получается...
Заранее спасибо.
...
Рейтинг: 0 / 0
20.01.2010, 11:39
    #36419965
WYPMAH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Robin-Bobin
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
        class Record : IComparable<Record>
        {
            public DateTime Date { get; set; }
            public int Num { get; set; }

            #region IComparable<Record> Members

            public int CompareTo(Record other)
            {
                return this.Date.CompareTo(other.Date);
            }

            #endregion
        }

        static void Main(string[] args)
        {
            List<Record> list = new List<Record>();
            list.Add(new Record() { Date = DateTime.Now.AddDays(1), Num = 1 });
            list.Add(new Record() { Date = DateTime.Now.AddDays(2), Num = 2 });
            list.Add(new Record() { Date = DateTime.Now.AddDays(-1), Num = 3 });
            list.Add(new Record() { Date = DateTime.Now.AddDays(-2), Num = 4 });
            list.Add(new Record() { Date = DateTime.Now, Num = 5 });

            DateTime specDate = DateTime.Now;

            Record findOne = list.Where(r => r.Date <= specDate).Max();
            Console.WriteLine(findOne.Num);

            Console.ReadKey();
        }

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
20.01.2010, 12:39
    #36420158
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
WYPMAH,

Спасибо большое за ответ.
По поводу следующего блока у меня сразу 2 вопроса:
Код: plaintext
Record findOne = list.Where(r => r.Date <= specDate).Max();

1. если не будет найдено ни одной записи с датой меньше заданной, то не будет эксепшена при .Max() ?
2. Как система понимает, что надо находить максимальное значение именно по дате, а по номеру? в .Max() никакого упоминания о дате нет...

P.S. К сожалению VS у меня сейчас нет, поэтому на практике проверить не могу...
...
Рейтинг: 0 / 0
20.01.2010, 12:53
    #36420195
WYPMAH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Robin-Bobin1. если не будет найдено ни одной записи с датой меньше заданной, то не будет эксепшена при .Max() ?
нет, не будет, findOne в итоге будет равен null.

Robin-Bobin2. Как система понимает, что надо находить максимальное значение именно по дате, а по номеру? в .Max() никакого упоминания о дате нет...
мой класс Record реализует интерфейс IComparable , который и используется в Max().

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
20.01.2010, 13:09
    #36420255
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
WYPMAH,

Спасибо большое! :)
...
Рейтинг: 0 / 0
20.01.2010, 21:25
    #36421521
Abbey Road
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
WYPMAH,

Как вариант:

var result = list.Where(x => x.Date <= specDate).OrderByDescending(x => x.Date).FirstOrDefault();

чтобы IComparable не реализовывать.
...
Рейтинг: 0 / 0
20.01.2010, 21:34
    #36421533
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Я тоже не вижу смысла в имплементации IComparable, ибо компариться может любой член класса, тот же Num.
Правильнее, написать линк-запрос, а не фиксить класс.
...
Рейтинг: 0 / 0
21.01.2010, 01:29
    #36421768
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Abbey Road,
МСУ,

Спасибо!
...
Рейтинг: 0 / 0
21.01.2010, 01:55
    #36421781
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
А как будет быстрее работать:
использовать OrderByDescending (по нужному полю), а потом брать первый элемент из получившегося списка
или же выполнить функцию Max (по нужному полю) и взять получившийся элемент?

Или же однофигственно?)
...
Рейтинг: 0 / 0
21.01.2010, 10:23
    #36422063
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
Robin-BobinА как будет быстрее работать:
использовать OrderByDescending (по нужному полю), а потом брать первый элемент из получившегося списка
или же выполнить функцию Max (по нужному полю) и взять получившийся элемент?

Или же однофигственно?)

А самому замерить слаб о ? :)
...
Рейтинг: 0 / 0
26.01.2010, 18:23
    #36432133
Robin-Bobin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по LINQ
МСУ,

Замерил, получилось однофигственно :)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос по LINQ / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]