我有一个日期集合(可能是重复的)我需要使用.Contains()
或类似方法进行检查。
我创建了一个这样的匿名类型:
var bookedDates = (from b in db.Bookings
where b.BookingDate > DateTime.Today
select new
{
Date = b.BookingDate,
StatusID = b.StatusId
});
然后我有一组日期(d)
,我需要测试我的匿名类型中是否存在d
。这可以很容易地使用字典,因为我可以使用.ContainsKey()
。
如果匿名类型中存在日期,我需要获取与我正在测试的日期相对应的一个或多个项目。
有没有快速的方法来做到这一点,我知道我可以通过循环和测试每一个键来实现它,但寻找更快/更有效的方法。
本质上,我正在寻找支持重复项目的词典。
答案 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