簡體   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