在LINQ中使用SkipWhile()的奇怪输出

时间:2014-12-08 10:43:53

标签: c# linq

我试图训练下面的例子但是为SkipWhile()操作得到奇怪的输出它没有显示预期的输出。有人可以解释原因吗?

        List<Employees> emp = new List<Employees>();
        emp.Add(new Employees() { EmpId = 1, DeptId = 1, Salary = 20000 });
        emp.Add(new Employees() { EmpId = 2, DeptId = 2, Salary = 1000 });
        emp.Add(new Employees() { EmpId = 3, DeptId = 1, Salary = 3000 });
        emp.Add(new Employees() { EmpId = 4, DeptId = 3, Salary = 5000 });
        emp.Add(new Employees() { EmpId = 5, DeptId = 2, Salary = 4000 });


        var hsal = emp.OrderByDescending(x => x.Salary).GroupBy(x => x.DeptId).Select(x => x.FirstOrDefault());
        var secS = hsal.SkipWhile(x => x.Salary < 19000);
        foreach (Employees x in secS)
        {
            Console.WriteLine("Employer {0} of Dept {1} gets {2} as salary", x.EmpId, x.DeptId, x.Salary);
        }

我得到的输出是,但它不应该产生任何结果,因为当它低于19000时必须跳过工资。

enter image description here

2 个答案:

答案 0 :(得分:2)

SkipWhile不会跳过具有给定条件的所有元素,但只有在满足此条件之前才会跳过所有元素。如果您想跳过所有使用Where

var secS = hsal.Where(x => x.Salary >= 19000);

输出(为什么&#34;它不应该产生任何结果&#34;,有一个工资= 20000?)

Employer 1 of Dept 1 gets 20000 as salary

答案 1 :(得分:1)

输出对我来说是正确的。

第一项的薪水为20000,不低于19000。

因此SkipWhile()不会跳过任何内容,因为第一项的谓词是假的。

因此,整个列表将在foreach中返回。