繁体   English   中英

从项目列表中删除项目

[英]Removing an item from a list of items

我的代码:

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


    }

我的目标:

  • 如果该项目不属于数据库中的表,则从列表中删除该项目

我的问题:

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

我的努力:

  • 试图研究并找到从列表或数组中删除项目的任何其他方法,没有一个出现此问题

不确定这里出什么问题了吗?

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

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

您的逻辑有些倒退。 调用.ToList() ,您正在创建原始列表的副本。 然后,当您调用.Remove() ,您将从该副本中删除该项目。

您可以做的是在foreach条件下对该项目调用.ToList() (以避免在修改枚举时出错),然后从主体内的实际列表中删除该项目:

更新:由于您要处理的类型是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();
ABCDetails.ABCLineItemsAuto.ToList().Remove(item);

ToList实际上创建了一个新列表,并从该列表中删除了它。 它不会更改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是一个数组, ABCDetails.ABCLineItemsAuto是一种处理方法。

该声明:

ABCDetails.ABCLineItemsAuto.ToList()

会给您一个新的集合,即List<T> ,当您调用Remove()它将从ABCLineItemsAuto删除新List<T>元素形式。

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

当我们调用ToList()我们会得到一个新的List<T>

当您调用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)));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM