[英]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.