【问题标题】:How to remove particular item from list in c#?如何从 C# 中的列表中删除特定项目?
【发布时间】:2022-01-02 07:07:11
【问题描述】:
 public List<ProjectEmployee> ProjectEmployeeList { get; set; } = new List<ProjectEmployee>(); 
 //List for Add employee to project

        public string EProjectId { get; set; }//projectemployee variables
        public string EmployeePid { get; set; } //projectemployee variables 

        Project1 p = new Project1(); //object for projectlist
        Employee1 e = new Employee1();//object for employee list

  public void AddProjectEmployee(ProjectEmployee projectemployee) // to add employee to 
  project
    {

        if (!p.ProjectList.Any(p => p.ProjectId == projectemployee.EProjectId)) // condition 
                                 to check project id is already present or not in projectlist
          {
            if (!e.EmployeeList.Any(p => p.EmployeeId == projectemployee.EmployeePid)) // 
                     condition to check employee id is already present or not in employeelist
            {
                ProjectEmployeeList.Add(projectemployee); //both condition true then it will 
                         add the values

            }

在这种方法中,我比较了两个列表数据,这就是使用对象 p 和对象 e 的原因。

            else
             {
                 Console.WriteLine("Not there"); //error message
             }
         }
     }

使用这种方法,我可以添加东西.. 如果我想从 projectemployee 列表中删除添加的数据,谁能告诉我该怎么做。

     public void DeleteEmployeeProject(ProjectEmployee projectemployee)
      {
        if (!ProjectEmployeeList.Any(p => p.EProjectId == projectemployee.EProjectId))                              
            {
            if (!ProjectEmployeeList.Any(p => p.EmployeePid == projectemployee.EmployeePid))                      
                 {
                ProjectEmployeeList.Remove(projectemployee); //(projectemployee); 
            }
            else
            {
                Console.WriteLine("Not there"); //error message
            }
        }
        foreach (var pe in ProjectEmployeeList)
        {
              Console.WriteLine($" Project id=|{pe.EProjectId}| +
                               Employee id= |{pe.EmployeePid}|");
                                            
         }
      }

我试过了,但它没有删除特定项目

【问题讨论】:

  • 当您尝试删除的项目与列表中的项目(完整对象)不完全匹配时,通常会发生这种情况。相反,根据 id 从员工列表中查找员工,然后删除您找到的项目。

标签: c# list


【解决方案1】:

看起来你已经从 Add 复制粘贴了代码,看起来像

if not any employee has eproject id of blah
  If not any employee has employee pid of blah
    add employee 

if 内的if 实际上是“和”,所以这个检查是

if no employee has eproject id blah and no employee has pid blah
  add them

这看起来很适合添加操作 - “如果员工不在那里,请添加他们”

虽然删除操作看起来不太好 - “如果员工在那里,请删除他们”


不过,我建议您更改逻辑。尝试根据 x 或 y 从列表中获取员工,然后根据您是否获得 default (null) 做出决定:

var p == ProjectEmployeeList.FirstOrDefault(p => 
  p.EmployeePid == projectemployee.EmployeePid ||
  p.ProjectId == projectemployee.EProjectId
);

p 现在肯定是匹配条件的实际列表项,或者如果没有匹配项,则为 null。然后你可以这样做:

//for add, the employee is not found/default if not there
if(p == default)
  ProjectEmployeeList.Add(projectemployee);

//for delete the employee is found/not-default if they are there
if(p != default)
  ProjectEmployeeList.Remove(p);

原因是“仅仅因为你创建了一个类的两个实例,其中包含相同的数据并不意味着当你要求它删除一个时,列表会认为它们是相同的”

var x = new ProjectEmployee { EmployeePid = 1};

var y = new ProjectEmployee { EmployeePid = 1};

Console.Print(x.Equals(y)); //false 

除非您覆盖了 C# 对象使用的默认 Equals,否则如果两个对象所在的内存地址相等,则它们将被视为相等。在上述两个新对象的情况下,它们不相等,因为它们将位于不同的内存地址

var a = new ProjectEmployee { EmployeePid = 1};
var b = a;
Console.Print(a.Equals(b)); //true 

Remove 使用 Equals 测试列表中的每个项目是否与传入的项目相等。如果您尚未提供自己的 Equals 方法来比较 ID:

override Equals(object other){
  return other is ProjectEmployee x && this.Id == x.Id; 
}

..那么您可以改为从列表中检索确切的项目,并将其传递回 Remove,以便要求删除的对象的内存地址是相同的(因此列表最终会执行“a equals” b" 场景而不是 "x 等于 y" 场景

如果您确定您已经处于“a 等于 b”的场景中,您可以执行 ProjectEmployeeList.Remove(projectEmployee),但如果是“键入要删除的员工的 id,请从中创建新员工,询问要删除的列表”,您将根据 Id 从列表中检索员工

脚注。如果你覆盖 Equals,也总是覆盖 GetHashCode

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2022-11-17
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多