【问题标题】:Delete() & Update() function in c# without using LINQ不使用 LINQ 的 C# 中的 Delete() 和 Update() 函数
【发布时间】:2021-08-14 19:37:28
【问题描述】:

所以我写了一个基本库存系统的代码,我的代码在更新时有一个基本错误,列表中的完整项目正在更新,而不是作为参数传递的首选 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");
        }           
    }

【问题讨论】:

  • 您正在检查列表中是否存在 ProductId,而不是检查当前产品是否具有所需的产品 ID。如果产品曾经在列表中,它将永远存在 - 因此所有项目都将被更新。

标签: c# console-application


【解决方案1】:

第二部分也是。

尝试在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 来选择特定项目。我不知道您的代码,但通常您可以在这样的对象列表中选择特定项目。

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");
        }
    }

【讨论】:

    【解决方案2】:

    我只能回答第二部分

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 2015-07-20
      • 2011-12-02
      • 1970-01-01
      • 2017-02-06
      • 2023-03-22
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多