从项目列表中删除项目

时间:2018-03-22 18:53:09

标签: c# linq

我的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        ABC ABCDetails;

        if(condition)
        {
            //ABCClient is a soap service that returns ABCDetails which consists of an array[] ABCDetails.ABCLineItemsAuto which is a list but for some reason it would show up as an array when returned from the service I check that it is declared a list in the service end.  
            ABCDetails = new ABCClient().GetABC(param1,param2).FirstOrDefault();

            foreach (var item in ABCDetails.ABCLineItemsAuto)
            {
                if (filterItemsDB.Any(c => c.itemCODE == item.itemType))
                {
                    //if its in the filterItemsDB which ia a list from databse table do something
                }
                else
                {
                    //if its not remove the item from the ABCDetails.ClaimLineItemsAuto which is an ARRAY[]

                    ABCDetails.ABCLineItemsAuto.ToList().Remove(item);
                }
            }
        }


    }

我的目标:

  • 如果该项不属于该表,则从列表中删除该项 来自DB

我的问题:

  • 删除(项目)运行正常,不会抛出任何错误,但不会 从ABCDetails.ABCLineItemsAuto数组中删除该项目。

我的努力:

  • 尝试研究并找到任何不同的方法来删除项目 从列表或数组中没有一个有这个问题

不确定这里有什么问题?

我无法使用ABCDetails.ABCLineItemsAuto.Remove(item),因为.Remove()不适用于array [] ABCDetails.ABCLineItemsAuto。

ABCClient是一个SOAP服务,它返回ABCDetails,它由一个数组[] ABCDetails.ABCLineItemsAuto组成,这是一个列表但是由于某种原因它会在从服务返回时显示为数组我检查它是否被声明服务端的列表。

4 个答案:

答案 0 :(得分:2)

你的逻辑略微倒退。当您致电.ToList()时,您需要创建原始列表的副本。然后,当您致电.Remove()时,您将从该副本中删除该项目。

您可以做的是在.ToList()条件中的项目上调用foreach(以避免出现有关修改枚举的错误),然后从实际<中删除该项目/ em>在体内列出:

更新:由于您要处理的类型是Array,因此可以轻松解决此问题,首先将其转换为List,因为它有方便的Remove()方法。然后在最后,您可以获取列表并在需要时将其分配回阵列。我更新了代码以显示它的外观:

var lineItemsList = ABCDetails.ABCLineItemsAuto.ToList();

// Use a copy of the list in your foreach condition
foreach (var item in lineItemsList.ToList())
{
    if (filterItemsDB.Any(c => c.itemCODE == item.itemType))
    {
        // Do something here, details aren't relevant to this question
    }
    else
    {
        lineItemsList.Remove(item);
    }
}

ABCDetails.ABCLineItemsAuto = lineItemsList.ToArray();

答案 1 :(得分:1)

ABCDetails.ABCLineItemsAuto.ToList().Remove(item);

ToList实际上会创建一个新的List并从该列表中删除itme。它不会改变ABCDetails.ABCLineItemsAuto中的原始列表。

您可以使用RemoveAll使用1个语句重写整个foreach块:

var lst = ABCDetails.ABCLineItemsAuto.ToList();
lst.RemoveAll(item => filterItemsDB.All(c => c.itemCODE != item.itemType));
ABCDetails.ABCLineItemsAuto = lst.ToArray();

这是关于这样做的一种方式,因为您刚刚表明ABCDetails.ABCLineItemsAuto是一个数组。

答案 2 :(得分:1)

声明:

ABCDetails.ABCLineItemsAuto.ToList()

会为您提供一个新的集合,例如List<T>,当您致电Remove()时,它会移除新List<T>而不是ABCLineItemsAuto的元素表单。

您需要做的是保留与List<T>的引用相同的集合,然后在其上调用Remove()

当我们致电ToList()时,我们会收到一个新的List<T>

答案 3 :(得分:1)

当您调用ToList()时,将实例化一个新的List。该项目正在从这个新项目中删除,但它保留在源代码上。只需拨打ABCDetails.ABCLineItemsAuto.Remove(item)即可将其删除。

你也可以在没有循环的情况下实现这个目标:

if(condition)
{
    //ABCClient is a soap service that returns ABCDetails
    ABCDetails = new ABCClient().GetABC(param1,param2).FirstOrDefault();

    ABCDetails.ABCLineItemsAuto = ABCDetails.ABCLineItemsAuto.Except(ABCDetails.ABCLineItemsAuto.Where(i => filterItemsDB.Any(f => f.itemCODE == i.itemType)));
}