Проверьте, существует ли элемент, и верните соответствующие элементы, используя .Contains () для анонимного типа. - PullRequest
1 голос
/ 23 апреля 2011

У меня есть коллекция дат (возможно, дубликаты), которую нужно проверить, используя .Contains() или аналогичный метод.

Я создаю анонимный тип, подобный этому:

var bookedDates = (from b in db.Bookings
                    where b.BookingDate > DateTime.Today
                    select new
                    {
                        Date = b.BookingDate,
                        StatusID = b.StatusId
                    });

У меня есть коллекция дат (d), и мне нужно проверить, существует ли d в моем анонимном типе.Это было бы легко, используя словарь, поскольку я могу использовать .ContainsKey().

Если в анонимном типе существует дата, мне нужно получить один или несколько элементов, соответствующих дате, которую я тестирую.

Есть ли быстрый способ сделать это, я знаю, что могу сделать это, зациклив и проверяя каждую клавишу, но ища более быстрый / более эффективный способ.

По сути, я 'ищу словарь, который поддерживает дубликаты.

Ответы [ 4 ]

3 голосов
/ 23 апреля 2011

Если вы просто хотите проверить, есть ли у вас уже дата, вы можете использовать HashSet , то проверьте хэш-набор в следующих запросах и т. Д.:

HashSet<DateTime> dates = new HashSet<DateTime>();
foreach (var item in bookedDates)
    dates.Add(item.Date);

..
if (dates.Contains(someDate))
{
    //...
}

Edit:

Я думаю вы просто хотите поиск на основе элементов в вашем запросе:

var dateLookup = db.Bookings
                   .Where( b => b.BookingDate > DateTime.Today)
                   .ToLookup( p => p.BookingDate, 
                              p => p.StatusId);

Поиск позволяет собирать элементы для каждого ключа, так что это может быть то, что вы ищете.

Тогда вы можете просто использовать это так:

var statusIdsForToday = dateLookup[DateTime.Now.Date].ToList();
0 голосов
/ 23 апреля 2011
var bookedDates = (from b in db.Bookings
        where b.BookingDate > DateTime.Today
        select new 
        {
            date = b.BookingDate,
            statusId = b.StatusId
        }).GroupBy(x => x.date).Where(x => x.Count() > 1);

Это должно дать вам IEnumerable типа IGrouping типа DateTime, StatusID типа

0 голосов
/ 23 апреля 2011

Может быть, я ошибаюсь, но вы можете применить другой запрос LINQ к вашему bookedDates, примерно так:

DateTime searchDateTime = DateTime.Now; // or any other DateTime
var statusIds = (from b
                 in bookedDates
                 where b.Date == searchDateTime // or a similar comparison
                 select b.StatusID);
var statusIdsList = statusIds.ToList();

edit: , если даты поиска находятся в той же базе данных, то join будет вариантом

var bookedIds = (from b
                 in db.Bookings
                 join dates in db.SearchDates on b.BookingDate equals dates
                 select b.StatusId);

(при условии, что сравниваемые даты находятся в db.SearchDates, при необходимости добавьте where dates > DateTime.Now или другие ограничения дат)

0 голосов
/ 23 апреля 2011

var DifferentNames = bookedDates.Distinct ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...