powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос по LINQ
11 сообщений из 11, страница 1 из 1
Вопрос по LINQ
    #36419857
Robin-Bobin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, плиз с 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
Вопрос по LINQ
    #36419965
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос по LINQ
    #36420158
Robin-Bobin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WYPMAH,

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

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

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

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

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

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

Как вариант:

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

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

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

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

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

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

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


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