【问题标题】:To remove an item in List删除列表中的项目
【发布时间】:2017-01-12 12:52:50
【问题描述】:

我正在尝试删除我的 gcNumber 中的一个项目,但它没有被删除。下面是我的代码。我知道我在做一些愚蠢的事情,但不知道在哪里:(

 var gcn=gcNumber.ToList();
 foreach (var selectGc in gcn)
   {                
        var countToRemove = _uow.GetRepository<TripSheetGcDetail>().GetAll().Where(x => x.FkGcId == selectGc.Id && x.IsActive == true).Select(y => y);
        if(countToRemove .Count()>0)
        {                   
            gcNumber.ToList().Remove(selectGc);
        }
        else
        {
        }

   }
    return gcNumber.ToList();

如果我的CountToRemove.count()&gt;0,那么我想在我的gcNumber 列表中删除该项目。请在我做错的地方提供帮助。

【问题讨论】:

    标签: asp.net-mvc entity-framework linq list


    【解决方案1】:
    gcNumber.ToList().Remove(selectGc);
    

    这一行创建了一个新列表,您可以从中删除内容,然后由于您不执行任何其他操作(例如将列表分配到任何位置),因此会将修改后的列表丢弃。

    我猜你想要做的是:

    gcn.Remove(selectGc);
    

    您还想修改您的foreach,使其不会循环访问正在修改的内容。

    foreach(var selectGg in gcNumber)
    

    这将遍历原始内容,允许您修改副本。

    您可能希望返回gcn,因为您的返回语句只是基于gcNumber 创建另一个新列表,而该列表尚未修改。

    总而言之:.ToList() 每次都会创建一个新列表,因此修改该列表不会对原始列表产生任何影响。

    【讨论】:

    • 我申请了gcn.Remove(selectGc);,但是当它去foreach它抛出一个错误gcn被修改
    • 你不能修改你正在迭代的东西。你的 foreach 应该看起来像这样:foreach (var selectGc in gcn.ToList()) 这样你就可以遍历一个副本,而不是正在修改的版本。
    • foreach(var selectGg in gcNumber) 是原始的,在您将其复制到新列表之前。
    • 明白了。感谢您的宝贵意见。
    【解决方案2】:

    而不是gcNumber.ToList().Remove(selectGc); 只是做gcNumber.Remove(selectGc);

    【讨论】:

      【解决方案3】:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      
      public class Program
      {
          public class MyClass
          {
              public string Name {get; set;}  
          }
      
          public static void Main()
          {
      
              var list = new List<MyClass>();
      
              list.Add(new MyClass() {Name = "aaa"});
              list.Add(new MyClass() {Name = "bbb"});
              list.Add(new MyClass() {Name = "ccc"});
              list.Add(new MyClass() {Name = "ddd"});
      
              var indexesToRemove = new List<int>();
      
              foreach(var item in list)
              {
                      if(item.Name == "aaa")
                          indexesToRemove.Add(list.IndexOf(item));
              }
      
              foreach (var num in indexesToRemove)
                  list.RemoveAt(num);
      
      
                  Console.WriteLine(list.First().Name);
      
          }
      }
      

      也许这不是从列表中删除项目的最佳方法,但很清楚。您不能删除正在枚举的项目表单列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        • 2016-05-08
        • 2011-03-18
        • 1970-01-01
        • 2018-12-01
        • 2016-01-29
        相关资源
        最近更新 更多