如何从SOAP服务返回的List(显示为数组)中移除指定项
解决ASP.NET中SOAP服务返回数组的项移除问题
嘿,我懂你的困扰——SOAP服务端声明的List<T>到了客户端经常会被序列化成数组,而数组是固定长度的,没法直接执行移除操作。这里给你几个实用的解决方案:
方案1:转成可变集合后批量移除(推荐)
先把返回的数组转换成支持增删操作的List<T>,再通过"先收集待删项、再批量移除"的方式避免遍历异常:
protected void Page_Load(object sender, EventArgs e) { ABC ABCDetails; if(condition) { // 获取SOAP服务返回的数据 ABCDetails = new ABCClient().GetABC(param1,param2).FirstOrDefault(); // 将数组转为可变List,空值处理避免NullReferenceException var mutableItems = ABCDetails.ABCLineItemsAuto?.ToList() ?? new List<ABCLineItem>(); // 先筛选出所有需要移除的项 var itemsToRemove = mutableItems.Where(item => filterItemsDB.Any(/* 你的过滤判断逻辑 */)).ToList(); // 批量移除待删项 foreach(var item in itemsToRemove) { mutableItems.Remove(item); } // 如果后续需要把集合转回数组(比如传给其他依赖数组的方法),可以这样做: // ABCDetails.ABCLineItemsAuto = mutableItems.ToArray(); } }
为什么不直接遍历集合删除?因为遍历器不允许集合在遍历过程中被修改,直接删除会触发
InvalidOperationException异常。
方案2:直接过滤保留项(更简洁)
如果你的需求只是保留符合条件的项,直接通过过滤生成新数组替换原数组就好,代码更简洁:
protected void Page_Load(object sender, EventArgs e) { ABC ABCDetails; if(condition) { ABCDetails = new ABCClient().GetABC(param1,param2).FirstOrDefault(); // 过滤出不需要移除的项,转为数组赋值回去 if(ABCDetails?.ABCLineItemsAuto != null) { ABCDetails.ABCLineItemsAuto = ABCDetails.ABCLineItemsAuto .Where(item => !filterItemsDB.Any(/* 你的过滤判断逻辑 */)) .ToArray(); } } }
额外优化:从根源解决集合类型问题
如果经常遇到这类问题,你可以修改SOAP服务引用的默认配置,让客户端直接接收List<T>:
- 右键项目中的服务引用 → 选择「配置服务引用」
- 在「集合类型」下拉框中选择
System.Collections.Generic.List<T>(默认是数组) - 保存配置后,后续服务返回的
List<T>在客户端就会直接是可变集合,不用手动转换了
内容的提问来源于stack exchange,提问作者sss111
相关产品推荐
相关产品推荐

