如何在LinQ中调用函数

时间:2019-05-02 02:31:12

标签: c# linq

我有一个函数,该函数接收两个日期并返回两个日期之间的工作日。

int WeekDayBetweenDates(DateTime firstDate, DateTime secondDate)

我想在Linq上调用此函数,如果我到达某个国家/地区,则需要检查日期,如果他们的注册日期是从今天开始的5个工作日。

例如,我有一个用户列表。

List<users> userList = getUsers();

public class user
{
   string Name;
   string Country;
   DateTime EnrollmentDate;
}

因此,我创建了一个函数,用于提取距今天不超过5个工作日且来自加拿大的用户

List<users> extract unQualifiedUsers(List<user> uList)
{
 List<user> uqUserList = new List<list>();

 uqUserList  = uList.Where(u=> u.Country == "Canada" && WeekDayBetweenDates(u.EnrollmentDate, DateTime.Now) > 5).ToList();

uList = uList.Except(uqUserList ).toList();

return uqUserList;
}

但是,这样做之后,我遇到了错误。我是否应该遍历加拿大的每个用户并获得他们?还是有办法在linQ中调用我的自定义方法?

3 个答案:

答案 0 :(得分:1)

首先,此代码不正确:

List<users> userList = getUsers();

public class user
{
   string Name;
   string Country;
   DateTime EnrollmentDate;
}

List<users>应该是List<user>。紧接着,NameCountryEnrollmentDate应标记为public以便被访问。

extract unQualifiedUsers方法的返回类型也是如此(该方法无效,因为方法名不能包含任何空格。

List<user> uqUserList = new List<list>();也不编译,因为您试图创建列表列表(?)。 List<user> uqUserList = new List<user>();将起作用。

uList = uList.Except(uqUserList).toList();是多余的,因为.Where已经进行了过滤(并且代码不正确。ToList的首字母为T。

最后,您的过滤逻辑不正确。您希望所有已注册少于5天的用户。

解决所有这些问题,将导致以下代码:

List<user> extractunQualifiedUsers(List<user> uList)
{
    return uList.Where(u => u.Country == "Canada" && WeekDayBetweenDates(u.EnrollmentDate, DateTime.Now) < 5).ToList();
}


public class user
{
    public string Name;
    public string Country;
    public DateTime EnrollmentDate;
}

建议:首先获取您的代码!未编译或不完整/不可测试的代码几乎总是在SO上被否定地接收。 This Help Center article是有关如何编写好的问题的很好的资源。

答案 1 :(得分:0)

因此,您有一个国家名称和一系列用户。

您希望居住在该国家/地区并具有从现在到现在的5天之间的EnrollmentDate的所有用户。

DateTime now = DateTime.UtcNow;
string country = ...
IEnumerable<User> users = ...
var result = users.Where(user => user.Country == country
                              && WeekdayBetweenDates(now, user.EnrollmentDate) < 5);

简单的漫画卓悦!

答案 2 :(得分:-5)

uqUserList  = uList.where(u=> { return u.Country == "Canada" && WeekDayBetweenDates(u.EnrollmentDate, DateTime.Now) });

您只需要使用大括号来包装代码即可。 通过使用此代码,您可以编写返回正确变量的任何代码。

此linq中使用where子句的示例,它必须返回布尔类型变量。