[英]Loop to delete multiple items in list…c#
我有一种方法,可以在数据库中搜索所有具有相同公司名称的客户,然后返回其ID号列表,现在将它们保存到文本文件中,以便确认它是否有效。
但是,我遇到的问题是访问该ID号列表,然后返回并删除它们。 在以下代码中,我使用了一个将通过其ID号取消客户的请求。 我使用了一个foreach循环,该循环应该获取ID的列表并将其全部删除,但是每次它只会删除一个,而不是一个不同的对象,而是每次都删除一个,而不是尝试删除,但我只是想获取异常说您正在尝试删除已经删除的客户 。 请发送关于我在做什么错的任何建议!
SearchRequest _request;
CancelRequest _request2;
SearchResponse _response;
CancelResponse _response2;
public void ArrangeRequest() {
_request=new CustomerSearchRequest();
_request.Company="Test Inc. ";
}
var customerIds=_response.Customers.Select(c => c.CustID).ToList();
foreach(var custID in customerIds) {
_request2=new CancelRequest();
_request2.CustID=custID;
_request2.Company=_request.Company;
}
public void Response() {
var ws=new RunEngine();
_response=ws.SearchCust(new AppHeader(), _request) as SearchResponse;
_response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse;
}
您正在重用_request2
字段。 与其在字段中存储单个取消请求,不如使用请求列表:
List<CancelRequest> _cancelRequests;
然后创建所有请求并将其添加到此列表中:
var customerIds = _response.Customers.Select(c => c.CustID);
_cancelRequests = customerIds.Select(custID => new CancelRequest {
CustID = custID,
Company = _request.Company
}).ToList();
然后一一处理这些请求。
似乎您的问题不会直接与list发生,因为您的CancelCust
可以处理一个Request
。 我实际上不明白您发布的最早的代码片段应该在哪里,所以我将其命名为NowhereMethod
!
我还为您的代码进行了修改,更正了_request.Company=_request.Company;
。 我根据您发布的代码进一步从用法中推导出了所有类的层次结构。
如您所述,删除操作是由CancelRequest
完成的,但是,如上所述,它一次只能处理一个Request
,并且可以推断该Request
仅保存有关一个客户的信息。 因此,我认为您的问题可以通过重写Response
方法来解决。
您仍然可以认为问题将使他们像其他答案所示那样成为列表,这些是使用Linq的正确方法。 但是,您可能需要确定放置某个类的正确位置,并且要么以正确的方式设计方法以获取列表。
所以,这就是我推论并试图纠正的代码; 请注意,我使用字段代替了那些可能是属性的 字段 ,并且只放置了那些需要的字段 。
您可能需要看一下代码中的注释。
partial class Listener /* I named it, to put your code */ {
SearchRequest _request;
CancelRequest _request2;
SearchResponse _response;
CancelResponse _response2;
public void ArrangeRequest() {
_request=new CustomerSearchRequest();
_request.Company="Test Inc. ";
}
void NowhereMethod() {
var customerIds=_response.Customers.Select(c => c.CustID).ToList();
foreach(var custID in customerIds) {
_request2=new CancelRequest();
_request2.CustID=custID;
_request2.Company=_request.Company;
}
}
public void ResponseOriginal() {
var ws=new RunEngine();
_response=ws.SearchCust(new AppHeader(), _request) as SearchResponse;
_response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse;
}
public void Response() /* tried to correct */ {
var ws=new RunEngine();
_response=ws.SearchCust(new AppHeader(), _request) as SearchResponse;
var customerIds=_response.Customers.Select(c => c.CustID).ToList();
foreach(var custID in customerIds) {
_request2=new CancelRequest();
_request2.CustID=custID;
_request2.Company=_request.Company;
// Seems it should be like this
// but note the assignment might be wrong, it's according to what `CancelCust` returns
// for the correct way to make it a list of Customer is appeared in other answers
_response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse;
}
}
}
partial class Customer {
public String CustID;
}
partial class Response {
public List<Customer> Customers;
}
partial class Request {
public String Company;
public String CustID;
}
partial class SearchResponse: Response {
}
partial class CancelResponse: Response {
}
partial class SearchRequest: Request {
}
partial class CancelRequest: Request {
}
partial class CustomerSearchRequest: SearchRequest {
}
partial class AppHeader {
}
partial class RunEngine {
public Response SearchCust(AppHeader appHelper, Request request) {
// I don't know what it's like
throw new NotImplementedException();
}
public Response CancelCust(AppHeader appHelper, Request request) {
// I don't know what it's like
throw new NotImplementedException();
}
}
Request
和Customer
可以声明为
partial class Customer {
// Company was not appearing used in the code
public String CustID;
}
partial class Request {
public String Company;
public String CustID;
}
要么
partial class Customer {
public String Company;
public String CustID;
}
partial class Request: Customer {
}
不会破坏代码。
_request
似乎是一个单独的变量,而不是列表。 这样一来,它只会做一条记录,因为您每次在循环中都会对其进行更新,并且不会在列表中存储任何先前的循环值。
编辑:您想做这样的事情:
var requestList = new List<CancelRequest>();
var customerIds = _response.Customers.Select(c => c.CustID).ToList();
foreach (var custID in customerIds)
{
_request = new CancelRequest();
_request.CustID = custID;
_request.Company = _request.Company;
requestList.Add(_request);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.