[英]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);
}
}
}
}
我的目標:
我的問題:
我的努力:
不確定這里出什么問題了嗎?
我無法使用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.