0

我想从 dateRange 获取所有日期值,其中每个日期时间都是DayOfWeek.Friday,.. Monday,.. Sunday

Intersect 不起作用,因为我猜这两个列表不是真正的交叉点......而且它们有不同的类型:DateTime vs. Enum.DayOfWeek

这只给了我所有星期五,但我也想要星期一,星期日......而不使用 OR 运算符。

var dateRange = _dateService.GetDateRange(startDate, endDate).Where(d => visibleWeekDays.Any(v => d.DayOfWeek == v)).ToList();

这些都是我必须以某种方式比较的列表:

IEnumerable<DateTime> dateRange = _dateService.GetDateRange(startDate, endDate);
IEnumerable<DayOfWeek> visibleWeekDays = new List<DayOfWeek>
{
    DayOfWeek.Friday,
    DayOfWeek.Monday,
    DayOfWeek.Sunday,
};

请不要将完整的 ling 查询写成解决方案。只需按照我必须用来解谜的随机顺序编写 linq 扩展方法。只是为了好玩和学习:)

更新

查看我的输入日期时间值和我想要的输出:

在此处输入图像描述

但请注意,visibleWeekDays 列表不是静态的。此集合中可以有动态数量的值。因此我可以也不想使用 && 或 || 操作员。

4

4 回答 4

1

当你发现自己处于想要一个交集的位置,但两个集合的类型不相同时,通常意味着你想要一个Join. 根据定义,交集是两个集合具有相同类型的连接,其中键选择器是“自身”,结果选择器只是随机选择其中一个项目(因为它们必须相等,所以交点的定义)。由于并非所有这些限制都适用于您,您需要做的就是走出更一般的Join.

作为一个演示,这里是一个Intersect使用 just的实现Join

public static IEnumerable<T> Intersect<T>(this IEnumerable<T> first
    , IEnumerable<T> second, IEqualityComparer<T> comparer)
{
    return first.Join(second, x => x, x => x, (a, b) => a, comparer);
}

DayOfWeek可以只选择自己作为键,然后您只需要一种从键选择器中获取对象的DayOfWeek方法。DateTime对于您的结果选择器,您只需要抓取DateTime对象;你不应该再需要这个DayOfWeek对象了。

每当您看到自己编写的 LINQ 解决方案中包含 a Where(x => collection.Any(...orContains或其他搜索操作时,Where您应该使用 aJoin代替,如果适用的话(您至少应该问自己是否应该使用 a Join)。

由于您不想要完整的实现,我将把它放在下面的剧透标签中。想自己写代码就别看了:

公共静态 IEnumerable FilterDaysOfWeek(IEnumerable 日期
    , IEnumerable daysOfWeek)
{
     返回日期。加入(daysOfWeek
         , 日期 => 日期.DayOfWeek
         , 天 => 天
         , (日期, 日期) => 日期);
 }

于 2013-03-04T20:20:47.413 回答
0

如果将 DayOfWeek 转换为整数,则可以进行简单的 > 和 < 比较以获取有效值,因此只需 .Where 查询就可以了。

于 2013-03-04T20:15:50.223 回答
0

如果您想获取与您的日期匹配的所有日期GetDateRange,可以使用以下 Linq 语句:DayOfWeekvisibleWeekdays

 _dateService.GetDateRange(startDate, endDate)
             .Where(d=> visibleWeekdays.Contains(d.DayOfWeek));

以下是对此的完整测试:

class Test
    {
        static void Main(string[] args)
        {
            var weekdays = new[] { DayOfWeek.Friday, DayOfWeek.Saturday, DayOfWeek.Sunday };
            var result = GetDateRange(DateTime.Today, DateTime.Today.AddDays(14))
                .Where(d => weekdays.Contains(d.DayOfWeek));
        }

        public static IEnumerable<DateTime> GetDateRange(DateTime start, DateTime end)
        {
            DateTime date = start;

            do
            {
                yield return date;
                date = date.AddDays(1);
            }
            while (date < end);
        }
    }
于 2013-03-04T20:17:40.920 回答
0

你可以ContainsvisibleWeekDays你的Where子句中使用。

于 2013-03-04T20:18:09.317 回答