我的代码:
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是一个SOAP服务,它返回ABCDetails,它由一个数组[] ABCDetails.ABCLineItemsAuto组成,这是一个列表但是由于某种原因它会在从服务返回时显示为数组我检查它是否被声明服务端的列表。
答案 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)));
}