在不使用 LINQ 的情况下,C# 中的 Delete() & Update() 函数

Delete() & Update() function in c# without using LINQ

所以我写了一个基本库存系统的代码,我的代码在更新时有一个基本错误,列表中的完整项目正在更新而不是作为参数传递的首选 ID,并且删除函数显示错误“集合已修改;枚举操作可能无法执行。” 我还是初学者

//This is my update method
    public void Update(int prodID)
    {
        if (prodID <= ProductList.Count)
        {
            foreach (Product p in ProductList)
            {
                if (ProductList.Exists(p => p.ProductId == prodID))
                {
                    Console.WriteLine("Product Name:");
                    string Name = Console.ReadLine();
                    Console.WriteLine("Product No.:");
                    string Productno = Console.ReadLine();
                    Console.WriteLine("Price:");
                    decimal Price = int.Parse(Console.ReadLine());
                    p.ProductName = Name;
                    p.ProductNo = Productno;
                    p.ListPrice = Price;
                }
            }
        }
        else
        {
            Console.WriteLine("ENTER A VALID PRODUCT ID\n");
        }
    }


//This is my Delete method
public void Delete(int prodID)
    { 
        if (prodID <= ProductList.Count)
        {
            foreach (Product p in ProductList)
            {                    
                if (ProductList.Exists(p => p.ProductId == prodID))
                {
                    ProductList.RemoveAt(prodID - 1);
                    Console.WriteLine("THE PRODUCT IS SUCCESSFULLY DELETED.\n");
                }    
            }
        }
        else
        {
            Console.WriteLine("ENTER A VALID PRODUCT ID\n");
        }           
    }

我只能回答第二部分

foreach 不适用于集合 - 它仅适用于枚举器。虽然集合可以隐式转换为枚举器,但该转换使它们受枚举器规则约束。

其中一条规则是:“如果基础集合被修改,枚举数应该变得无效”。这正在这里发生。因此,如果您打算修改集合(通过添加、删除或替换),则不能使用 foreach。

第二部分也是。

尝试在 foreach(ProductList 中的 Product p)之后添加 .ToList()

public void Delete(int prodID)
    { 
        if (prodID <= ProductList.Count)
        {
            foreach (Product p in ProductList.ToList())
            {                    
                if (ProductList.Exists(p => p.ProductId == prodID))
                {
                    ProductList.RemoveAt(prodID - 1);
                    Console.WriteLine("THE PRODUCT IS SUCCESSFULLY DELETED.\n");
                }    
            }
        }
        else
        {
            Console.WriteLine("ENTER A VALID PRODUCT ID\n");
        }           
    }

如果您调用 toList() 将“生成”一个单独的列表,因此 foreach 使用另一个列表而不是“原始”ProductList。这意味着您可以毫无问题地编辑和删除 ProductList 中的项目。

希望这对你有用。


代码优化

您也可以尝试使用 .Select 和 .Where 将您的列表添加到 select 特定项目。我不知道您的代码,但通常您可以 select 像这样的对象列表中的特定项目。

public void Update(int prodID)
    {
        var product = ProductList.Where(p => p.ProductId == prodID).FirstOrDefault();
        if (product != null) {
            Console.WriteLine("Product Name:");
            string Name = Console.ReadLine();
            Console.WriteLine("Product No.:");
            string Productno = Console.ReadLine();
            Console.WriteLine("Price:");
            decimal Price = int.Parse(Console.ReadLine());
            p.ProductName = Name;
            p.ProductNo = Productno;
            p.ListPrice = Price;
        }
        else
        {
            Console.WriteLine("ENTER A VALID PRODUCT ID\n");
        }
    }