C#中for循环未输出所有匹配Employee实例问题排查
LINQ查询结果重复显示同一员工的原因及解决方法
问题场景
你正在开发一个基于Employee列表的程序,初始化员工列表的代码如下:
List<Employee> emp = new List<Employee>(); emp.Add(new Employee("Bran", 2500)); emp.Add(new Employee("Mike", 1500)); emp.Add(new Employee("Isaac", 1000)); emp.Add(new Employee("Patrick", 100)); emp.Add(new Employee("Spongebob", 2000)); emp.Add(new Employee("Spongegar", 1200));
你需要查询姓名以"Spo"开头的员工,编写的查询代码如下:
Console.WriteLine("\nResults of sequential search "); Employee em = null; //flag string name = "Spo"; int i; var match = from e in emp where e.Name.StartsWith(name) select e; em = match.FirstOrDefault(); i = emp.IndexOf(em); MoreEmployee(); if (match.Any()) { for (int x =0; x < emp.Count; x++) { Console.WriteLine((x +1) + ". " + em.Name + " " + em.Salary.ToString("C") + " " + em.AnnualSal.ToString("C")); } } else { Console.WriteLine("Employee Not found"); }
运行后发现输出重复显示Spongebob6次,而非预期的Spongebob和Spongegar,需要找出错误原因及正确遍历方法。
错误原因
- 遍历逻辑完全错误:你通过
match.FirstOrDefault()只拿到了第一个匹配的员工(Spongebob),然后在for循环里遍历的是原emp列表的总长度(6次),每次循环都输出同一个em对象的信息,自然会重复6次。 - 代码里的
i = emp.IndexOf(em)和MoreEmployee()属于冗余代码,对查询结果没有任何作用。
正确遍历方法
方法一:直接遍历LINQ查询结果(推荐)
用foreach直接遍历match集合,每次迭代获取当前匹配的员工:
Console.WriteLine("\nResults of sequential search "); string name = "Spo"; var match = from e in emp where e.Name.StartsWith(name) select e; if (match.Any()) { int itemNum = 1; foreach (var employee in match) { Console.WriteLine($"{itemNum}. {employee.Name} {employee.Salary.ToString("C")} {employee.AnnualSal.ToString("C")}"); itemNum++; } } else { Console.WriteLine("Employee Not found"); }
方法二:转成列表后用for循环遍历
如果习惯用for循环,可以先把LINQ查询结果转为List<Employee>,再遍历结果列表:
Console.WriteLine("\nResults of sequential search "); string name = "Spo"; // 将查询结果转为列表 var matchList = (from e in emp where e.Name.StartsWith(name) select e).ToList(); if (matchList.Any()) { for (int x = 0; x < matchList.Count; x++) { var employee = matchList[x]; Console.WriteLine($"{x + 1}. {employee.Name} {employee.Salary.ToString("C")} {employee.AnnualSal.ToString("C")}"); } } else { Console.WriteLine("Employee Not found"); }
内容的提问来源于stack exchange,提问作者Bran
相关产品推荐
相关产品推荐

