检查项是否存在,并使用匿名类型的.Contains()返回匹配的元素

时间:2011-04-22 21:11:33

标签: c# linq collections

我有一个日期集合(可能是重复的)我需要使用.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 个答案:

答案 0 :(得分:2)

如果您只想检查是否已有日期,可以使用HashSet,然后检查以下查询中的哈希集等:

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

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

修改

认为您只想根据查询中的项目进行查找:

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

查找允许每个键的项目集合,因此可能就是您要查找的内容。

然后你可以像这样使用它:

var statusIdsForToday = dateLookup[DateTime.Now.Date].ToList();

答案 1 :(得分:0)

var distinctNames = bookedDates.Distinct();

答案 2 :(得分:0)

也许我弄错了,但您可以在bookedDates上应用另一个LINQ查询,如下所示:

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();

编辑:如果搜索日期来自同一个数据库,那么加入将是一个选项

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或其他限制

答案 3 :(得分:0)

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类型为DateTime,StatusID类型

的IGrouping