Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 可以使用DateTime列表筛选列表的Linq查询<;对象>;_C#_Linq_Datetime_Asp.net Core 3.1 - Fatal编程技术网

C# 可以使用DateTime列表筛选列表的Linq查询<;对象>;

C# 可以使用DateTime列表筛选列表的Linq查询<;对象>;,c#,linq,datetime,asp.net-core-3.1,C#,Linq,Datetime,Asp.net Core 3.1,我试图通过使用动态创建的日期时间列表,按任何周末过滤一组数据。DateTimes列表中有多个日期,其中包含一个开始日期和一个结束日期。这可以是过去任何一个周末 DateTimes列表与此类似: public class ShiftTimeFilter { public DateTime ShiftTimeFrom { get; set; } public DateTime ShiftTimeTo { get; set; } } 创建的日期在新列表()中 这将为给定的周末创建

我试图通过使用动态创建的日期时间列表,按任何周末过滤一组数据。
DateTimes
列表中有多个日期,其中包含一个开始日期和一个结束日期。这可以是过去任何一个周末

DateTimes列表与此类似:

public class ShiftTimeFilter
{
     public DateTime ShiftTimeFrom { get; set; }
     public DateTime ShiftTimeTo { get; set; }
}
创建的日期在
新列表()中
这将为给定的周末创建以下示例日期

[0] ShiftTimeFrom : {23/01/2021 00:30}, ShiftTimeTo : {23/01/2021 16:30}
[1] ShiftTimeFrom : {24/01/2021 17:30}, ShiftTimeTo : {24/01/2021 19:30}
我可以做一天,即周六或周日,但我不明白如何使用日期时间列表将这两天合并并一次性过滤。 myData模型如下所示:

public class myData
{
    public DateTime ReadingDate { get; set; }
    public double ReadingValue { get; set; }
}
我正在使用的查询:

   var data = myData.Where(x => x.ReadingDate.DayOfWeek == DayOfWeek.Saturday 
                 && x.ReadingDate > ShiftTimeFrom 
                 && x.ReadingDate <= ShiftTimeFrom )
               .Select(x => new Data { myDate = x.ReadingDate, myVal = x.ReadingValue })
               .ToList();
var data=myData.Where(x=>x.ReadingDate.DayOfWeek==DayOfWeek.Saturday
&&x.ReadingDate>ShiftTimeFrom
&&x.ReadingDate新数据{myDate=x.ReadingDate,myVal=x.ReadingValue})
.ToList();
我遇到的一个问题是,客户可能会在几个月内选择一段时间,他们希望在这段时间内每个周末都能看到。因此,在某些情况下,日期列表中可能包含10或20个日期

我希望使用Linq过滤日期,告诉我所有日期之间的所有数据
列表和任何不在这些日期之间的内容,我想将其值设置为零


TIA

我会在过滤器中添加一些逻辑,以简化查询。e、 g.定义接口
IDateTimeFilter

public interface IDateTimeFilter {

    bool IsMatch(DateTime pointInTime);

}
并调整类
ShiftTimeFilter
以实现它:

public class ShiftTimeFilter : IDateTimeFilter {

    public ShiftTimeFilter(DateTime from, DateTime to) {
        if (from < to) {
            ShiftTimeFrom = from;
            ShiftTimeTo = to;
        } else {
            ShiftTimeTo = from;
            ShiftTimeFrom = to;
        }
    }

    public DateTime ShiftTimeFrom { get; }

    public DateTime ShiftTimeTo { get; }

    public Boolean IsMatch(DateTime pointInTime) {
        return (pointInTime >= ShiftTimeFrom) && (pointInTime < ShiftTimeTo);
    }

}
公共类ShiftTimeFilter:IDateTimeFilter{
公共ShiftTimeFilter(日期时间从,日期时间到){
如果(从<到){
ShiftTimeFrom=来自;
ShiftTimeTo=to;
}否则{
shiftitimeto=来自;
ShiftTimeFrom=至;
}
}
public DateTime ShiftTimeFrom{get;}
public DateTime shiftttimeto{get;}
公共布尔值IsMatch(日期时间点时间){
返回(pointInTime>=ShiftTimeFrom)和&(pointInTime
并创建一个组合过滤器的新类,同时实现接口:

public class ShiftTimeFilterList : IDateTimeFilter {

    private IDateTimeFilter[] Filters { get; }

    public ShiftTimeFilterList(IEnumerable<IDateTimeFilter> dateTimeFilters) {
        if (dateTimeFilters is null) throw new ArgumentNullException(nameof(dateTimeFilters));
        Filters = dateTimeFilters.Where(e => e is object).ToArray();
    }

    // [Edited: NetMage's simplification implemented]
    public bool IsMatch(DateTime pointInTime) => Filters.Any(filter => filter.IsMatch(pointInTime));

}
公共类ShiftTimeFilterList:IDateTimeFilter{
私有IDateTimeFilter[]筛选器{get;}
公共ShiftTimeFilterList(IEnumerable dateTimeFilters){
如果(dateTimeFilters为null)抛出新的ArgumentNullException(nameof(dateTimeFilters));
Filters=dateTimeFilters.Where(e=>e是对象).ToArray();
}
//[已编辑:实现NetMage的简化]
public bool IsMatch(DateTime pointInTime)=>Filters.Any(filter=>filter.IsMatch(pointInTime));
}
现在,您可以使用这样一个简单的查询来获取匹配的数据:

IEnumerable<myData> dataToBeFiltered = GetData();
IDateTimeFilter filter = GenerateFilter();

List<myData> result = dataToBeFiltered.Where(e => filter.IsMatch(e.ReadingDate)).ToList();
IEnumerable datatobefilted=GetData();
IDateTimeFilter=GenerateFilter();
List result=datatobefilted.Where(e=>filter.IsMatch(e.ReadingDate)).ToList();

我会在过滤器中添加一些逻辑来简化查询。e、 g.定义接口
IDateTimeFilter

public interface IDateTimeFilter {

    bool IsMatch(DateTime pointInTime);

}
并调整类
ShiftTimeFilter
以实现它:

public class ShiftTimeFilter : IDateTimeFilter {

    public ShiftTimeFilter(DateTime from, DateTime to) {
        if (from < to) {
            ShiftTimeFrom = from;
            ShiftTimeTo = to;
        } else {
            ShiftTimeTo = from;
            ShiftTimeFrom = to;
        }
    }

    public DateTime ShiftTimeFrom { get; }

    public DateTime ShiftTimeTo { get; }

    public Boolean IsMatch(DateTime pointInTime) {
        return (pointInTime >= ShiftTimeFrom) && (pointInTime < ShiftTimeTo);
    }

}
公共类ShiftTimeFilter:IDateTimeFilter{
公共ShiftTimeFilter(日期时间从,日期时间到){
如果(从<到){
ShiftTimeFrom=来自;
ShiftTimeTo=to;
}否则{
shiftitimeto=来自;
ShiftTimeFrom=至;
}
}
public DateTime ShiftTimeFrom{get;}
public DateTime shiftttimeto{get;}
公共布尔值IsMatch(日期时间点时间){
返回(pointInTime>=ShiftTimeFrom)和&(pointInTime
并创建一个组合过滤器的新类,同时实现接口:

public class ShiftTimeFilterList : IDateTimeFilter {

    private IDateTimeFilter[] Filters { get; }

    public ShiftTimeFilterList(IEnumerable<IDateTimeFilter> dateTimeFilters) {
        if (dateTimeFilters is null) throw new ArgumentNullException(nameof(dateTimeFilters));
        Filters = dateTimeFilters.Where(e => e is object).ToArray();
    }

    // [Edited: NetMage's simplification implemented]
    public bool IsMatch(DateTime pointInTime) => Filters.Any(filter => filter.IsMatch(pointInTime));

}
公共类ShiftTimeFilterList:IDateTimeFilter{
私有IDateTimeFilter[]筛选器{get;}
公共ShiftTimeFilterList(IEnumerable dateTimeFilters){
如果(dateTimeFilters为null)抛出新的ArgumentNullException(nameof(dateTimeFilters));
Filters=dateTimeFilters.Where(e=>e是对象).ToArray();
}
//[已编辑:实现NetMage的简化]
public bool IsMatch(DateTime pointInTime)=>Filters.Any(filter=>filter.IsMatch(pointInTime));
}
现在,您可以使用这样一个简单的查询来获取匹配的数据:

IEnumerable<myData> dataToBeFiltered = GetData();
IDateTimeFilter filter = GenerateFilter();

List<myData> result = dataToBeFiltered.Where(e => filter.IsMatch(e.ReadingDate)).ToList();
IEnumerable datatobefilted=GetData();
IDateTimeFilter=GenerateFilter();
List result=datatobefilted.Where(e=>filter.IsMatch(e.ReadingDate)).ToList();

您可能希望动态生成一个表达式,其中包含我所描述的一组“或”表达式,或者简单地为每个日期范围创建一个单独的查询,并将它们合并在一起,正如我在这个非常类似的问题中所描述的:您使用的LINQ是:LINQ to Objects、SQL、EF 6.x、EF Core 2.0/2.1/3.x/5.x?如果使用数据库,哪个数据库提供程序?您可能希望动态生成一个表达式,其中包含我所描述的一组“或”表达式,或者简单地为每个日期范围创建一个单独的查询,并将它们合并在一起,正如我在这个非常类似的问题中所描述的:您使用的是哪个LINQ:LINQ to Objects,SQL,EF 6.x,EF核心2.0/2.1/3.x/5.x?如果使用数据库,哪个数据库提供程序?
public bool IsMatch(DateTime pointInTime)=>Filters.Any(filter=>filter.IsMatch(pointInTime))
其中(e=>e是对象)
的意义是什么?你知道
e
IDateTimeFilter
,所以它必须是
对象
@NetMage:半现代的查询方式
!=空
。C#有一个问题,
!=null
==null
比较仍然由任何相应的运算符重载处理,然后可以确定给定对象对于它们来说足够空,并且等于
null
,并返回
true
,即使是非nu