Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 如何筛选包含日期的列表并在7天内仅检索数据_C#_Asp.net_Linq_Lambda - Fatal编程技术网

C# 如何筛选包含日期的列表并在7天内仅检索数据

C# 如何筛选包含日期的列表并在7天内仅检索数据,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,所以我有这个模型: Student Model public int StudentId {get; set;} public string StudentName {get; set;} public DateTime EnrollDate {get; set;} 我还有一个学生模型的列表,类似于 List<Student> listOfStudents = new List<Student>(); 它正在工作。但是,我目前很难在从今天开始的7天内只显示注册日期。

所以我有这个模型:

Student Model

public int StudentId {get; set;}
public string StudentName {get; set;}
public DateTime EnrollDate {get; set;}
我还有一个学生模型的列表,类似于

List<Student> listOfStudents = new List<Student>();

它正在工作。但是,我目前很难在从今天开始的7天内只显示注册日期。

从概念上讲,我认为LINQ非常像SQL。您有选择部分,这是您的投影,即我从这组数据中提取什么?。如果您省略LINQ中的Select子句,那么您将得到整个记录,而如果您只想提取其中的一部分,则只会得到一部分记录。你有你的WHERE部分,它是一个限制器,或者过滤条件,当应用到集合中时,只回拉满足所述条件的记录。最后,您可以应用一些操作来影响返回集的顺序。这就是OrderBy和OrderByDescending发挥作用的地方。让我们将这些概念映射到下面的示例中

没有选择,但我们有一个Where和OrderBy 运行时,sortedStudents将仅加载学生的整个学生对象,而不是符合我们Where标准的投影。Where函数接受指定条件的谓词。谓词只是一个函数,它从我们正在筛选的集合中接受一条记录,并返回一个bool,指示是否应该包含它。

让我们通过调整Where来更换过滤器 与之前一样,分类学生将有完整的学生记录,但这一次将只包含2018年6月26日之后或之后注册的学生,如我们的谓词所述。

让我们添加一个Select 现在我们改变了它,这样我们就不用把一个学生全部拉回来,只需要把报名日期拉出来。注意,我已经将接收变量的名称从sortedStudents更改为dates,这反映了它现在只包含DateTime对象列表的事实。
您仍然可以将.OrderBy替换为.OrderByDescending以更改顺序。

将问题分解为两个子问题如何

子问题1 仅显示从今天起7天内的注册日期

我们只需要注册日期属性在今天起7天内的学生:

var today = DateTime.UtcNow;
sevenDaysOldList = listOfStudents.Where(x => (today - x.EnrollDate).TotalDays < 7); 
…这将对列表进行适当排序。它返回一个新的有序列表,实现:

联合收割机1和2 现在,您可以将两个子问题的解决方案合并为一个。你怎么做由你自己决定。我会这样做:

var sevenDaysOldList = listOfStudents.Where(x => (today - x.EnrollDate).TotalDays < 7)
                                     .OrderByDescending(x => x.EnrollDate);

你们有比今天更重要的学生吗?你想在今天之前和之后,但在7天期限内,也有学生吗?嗨,谢谢你,不要比今天更重要。在今天之前,但在7天内限制。谢谢你能写一个函数,它只接受一个日期,如果它满足你的条件,则返回true,否则返回false吗?谢谢你的帮助!非常感谢你的帮助。我还有一个要求。如何修改/排序2018年6月26日之前删除所有列表的列表?因此,该列表的数据日期将仅大于2018年6月26日。任何日期在6月26日之前的数据都将被删除,因此您必须像编写SQL一样思考,不确定是否已这样做。无论何时筛选集合,都将在WHERE子句中进行筛选。我会用更多信息更新我的答案。非常感谢你的帮助。我还有一个要求。如何修改/排序2018年6月26日之前删除所有列表的列表?因此,该列表的数据日期将仅大于2018年6月26日。任何日期在6月26日之前的数据都将被删除Hello!对不起,再次打扰。嗯,如果删除2018年6月26日之后的所有日期呢?当然这很容易弄清楚。。将x.EnrollDatefilterDate切换:
//Notice we've changed 'then' from 7 days ago to a fixed point in time: 26 June 2018
var then = new DateTime.Parse("26 June 2018"); 
var sortedStudents = listOfStudents
  .Where(s => s.EnrollDate >= then) 
  //Still no Select(). We'll do that next
  .OrderBy(s => s.EnrollDate);
var then = new DateTime.Parse("26 June 2018"); 
var dates = listOfStudents
  .Where(s => s.EnrollDate >= then) 
  .Select(s => s.EnrollDate);
var today = DateTime.UtcNow;
sevenDaysOldList = listOfStudents.Where(x => (today - x.EnrollDate).TotalDays < 7); 
sevenDaysOldList.Sort((x, y) => y.EnrollDate.CompareTo(x.EnrollDate));
sevenDaysOldList.OrderByDescending(x => x.EnrollDate);
// and of course .OrderBy(x => x.EnrollDate) for ascending order
var sevenDaysOldList = listOfStudents.Where(x => (today - x.EnrollDate).TotalDays < 7)
                                     .OrderByDescending(x => x.EnrollDate);
var filterDate = new DateTime(2018, 06, 26);
sevenDaysOldList.RemoveAll(x => x.EnrollDate < filterDate);