Linq哪里条件不起作用

时间:2018-04-18 14:20:10

标签: c# .net linq

我试图将所有姓氏过滤为"彼得"

但它没有过滤而是列出了没有过滤器的所有行

我在做什么错?

if (pagedCollection != null)
{
    do
    {
        List<IUser> usersList = pagedCollection.CurrentPage.ToList();

        usersList.Where(x => !string.IsNullOrEmpty(x.Surname) && x.Surname.Contains("Peter")).FirstOrDefault();

        foreach (IUser user in usersList)
        {
            userList.Add((User) user);
        }
        pagedCollection = await pagedCollection.GetNextPageAsync();
    } 
    while (pagedCollection != null);
}

3 个答案:

答案 0 :(得分:4)

由于SurName,此行返回"Peter"包含FirstOrDefault单个用户

usersList.Where(x => !string.IsNullOrEmpty(x.Surname) && x.Surname.Contains("Peter")).FirstOrDefault();

但是你没有将结果存储在任何地方。它没有“过滤”原始列表:

usersList = usersList 
    .Where(x => !string.IsNullOrEmpty(x.Surname) && x.Surname.Contains("Peter"))
    .ToList();

实际上这个查询也不会过滤原始列表,而是创建一个新的,最后将这个新列表重新分配给旧变量。所以效果类似于过滤。

答案 1 :(得分:2)

其中返回一个IEnumeable,你当前占用了第一个实例,然后扔掉它。

试试这个

if (pagedCollection != null)
{
    do
    {
        List<IUser> usersList = pagedCollection.CurrentPage.ToList();
        usersList = usersList.Where(x => !string.IsNullOrEmpty(x.Surname) && x.Surname.Contains("Peter"));
        pagedCollection = await pagedCollection.GetNextPageAsync();
    } 
    while (pagedCollection != null);
}

答案 2 :(得分:1)

使用用户列表中的where条件应用过滤后,您正在处理原始用户列表,而不是在过滤后处理结果列表。因此,它每次都包含所有用户。

var filteredUserList = usersList.Where(x => !string.IsNullOrEmpty(x.Surname) 
                                             && x.Surname.Contains("Peter"));

这应显示已过滤的用户。

此外,FirstOrDefault将仅过滤一个满足过滤条件的用户,您应该将其删除,并在启动foreach循环之前检查空值。