You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:55:21