Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将2个列表与LINQ进行比较_C#_Linq - Fatal编程技术网

C# 将2个列表与LINQ进行比较

C# 将2个列表与LINQ进行比较,c#,linq,C#,Linq,我想从dateRange获取所有日期值,其中每个datetime都是星期五、星期一、星期天 交叉点不起作用,因为我猜这两个列表不是真正的交叉点。。。它们有不同的类型:DateTime和Enum.DayOfWeek 这只给了我所有的星期五,但我也想要星期一,星期天。。。不使用OR运算符 var dateRange = _dateService.GetDateRange(startDate, endDate).Where(d => visibleWeekDays.Any(v => d.D

我想从dateRange获取所有日期值,其中每个datetime都是星期五、星期一、星期天

交叉点不起作用,因为我猜这两个列表不是真正的交叉点。。。它们有不同的类型:DateTime和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,
};
IEnumerable dateRange=\u dateService.GetDateRange(startDate,endDate);
IEnumerable visibleWeekDays=新列表
{
星期五,星期五,
星期一,星期一,
星期天,星期天,
};
请不要将完整的查询作为解决方案写入。 只需按随机顺序编写linq扩展方法,我就可以用来解答这个谜题。 只是为了好玩和学习:)

更新

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


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

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

如果要获取
GetDateRange
中所有日期的
DayOfWeek
visibleWeekdays
中的日期匹配,可以使用以下Linq语句:

var dateRange = _dateService.GetDateRange(startDate, endDate).Where(d => visibleWeekDays.Any(v => d.DayOfWeek == v)).ToList();
 _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);
        }
    }
类测试
{
静态void Main(字符串[]参数)
{
var weekdays=新[]{DayOfWeek.周五,DayOfWeek.周六,DayOfWeek.周日};
var result=GetDateRange(DateTime.Today,DateTime.Today.AddDays(14))
。其中(d=>weekdays.Contains(d.DayOfWeek));
}
公共静态IEnumerable GetDateRange(日期时间开始,日期时间结束)
{
日期时间日期=开始;
做
{
收益率返回日期;
日期=日期。添加天数(1);
}
while(日期<结束);
}
}

您可以在
Where
子句中的
visibleWeekDays
中使用
Contains

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

作为一个示例,下面是使用Just
Join
实现的
Intersect

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


你能解释一下你想要完成什么吗?您能说明预期的i/o是什么吗?以随机顺序给出答案是不合适的。这个问题可能对未来的读者有所裨益。我已编辑您的问题以删除该评论。请参阅我的答案,它将提供您定义的输出。转储
dateRange
的内容以查看它是否仅包含星期五。你的代码应该可以工作@我想Oliver的代码更好,你的查询应该可以。您确定
GetDateRange
没有问题吗?您是否阅读了我的非工作示例,其中的.Any()与Contains()的行为相同。它只返回星期五…我明白了,GetDateRange在做什么?它确实输出了正确的日期吗?它从startDate到endDate获取datetime值。没有过滤。啊!这就解释了,我刚刚添加了一个测试示例。是的,我以前的.Any()也可以。但我必须承认,我更喜欢Servey的解决方案。这可能会使代码看起来更干净一些,但执行起来不会有任何不同。@Servy:the
any
版本很难阅读,
Contains
则不然。OP没有要求一个不同的功能版本,只是一个工作版本
Join
具有不同的语义,但考虑到内部列表的大小,优化版本可能会使用一个简单的内部列表,使差异最小化。是的,然后使用查询样式就很容易了:var query=from d in dateRange join v in visibleWeekDays on d.DayOfWeek=v select new{VisibleDate=d}@Elisa您不需要/不想创建一个新的匿名对象来保存日期。只需
选择d
,即可完成。除此之外,是的,那很好用。对于是否使用查询与方法语法,这主要是个人偏好。啊,对了。。。我习惯于ext方法样式,几乎从不使用查询样式。但是有了联接,查询样式就更容易了。与contains()/Any()相比,我更喜欢您的解决方案,因为它在语义上似乎更正确、更明显:是的,在这种情况下,我选择使用方法语法,因为它突出了
Join
Intersect
之间的区别。您会注意到,在我的回答中,两个
Join
调用之间唯一的区别在于第一个键选择器(以及变量名和空格,但它们并不真正起作用)。这种比较中的对称性太好了,无法传递。