【问题标题】:Loop to delete multiple items in list...c#循环删除列表中的多个项目...c#
【发布时间】:2013-03-11 15:39:48
【问题描述】:

我有一种方法可以在数据库中搜索所有具有相同公司名称的客户,然后返回他们的 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;
}

【问题讨论】:

  • cancelRequest 执行删除。我不必为此手动编写代码。它是一个自动生成的对象。
  • @GrantThomas 大概取消请求的集合是通过其他方法发送到服务器的。关键是 OP 唯一不知道如何做的是属性创建取消对象;他能够使用它们自己实际删除数据。

标签: c# linq loops foreach


【解决方案1】:

您正在重用_request2 字段。不要在字段中存储单个取消请求,而是使用请求列表:

List<CancelRequest> _cancelRequests;

然后创建所有请求并将其添加到此列表中:

var customerIds = _response.Customers.Select(c => c.CustID);
_cancelRequests = customerIds.Select(custID => new CancelRequest { 
                          CustID = custID,
                          Company = _request.Company
                  }).ToList();

然后一一处理这些请求。

【讨论】:

  • 这里的_request.Company 是什么?
  • @IronMan84 这是 OP 使用的。如果这不是它应该的样子,我们就不知道那里有什么。
  • 我认为在将新实例分配给有问题的_request 之后,可以删除此行
  • @IronMan84,就是要在数据库中搜索的值,找到常见的客户,并把他们放到一个待删除的列表中
  • 您可以在第一行使用AsEnumerable 而不是ToList,以确保在客户端执行第二个Select,而不会强制将整个查询拉入内存并且无需创建列表从未使用过。
【解决方案2】:

似乎您的问题不会直接发生在列表中,因为您的CancelCust 一次可以处理一个Request。我实际上无法理解您发布的最早的代码片段应该在哪里,所以我将其命名为NowhereMethod

我还修改了您的代码,更正了 _request.Company=_request.Company; 之类的内容。我根据您发布的代码进一步从用法中推断出您的所有类层次结构。

正如您所说,删除是由CancelRequest完成的,但是,正如我上面提到的,它一次只能删除一个Request,而Request推断它只保存了一个信息顾客。因此,我认为您的问题可以通过重写 Response 方法来解决。

您仍然可以认为问题即将使它们像其他答案一样成为列表,这些都是使用 Linq 的正确方法。尽管如此,您可能需要决定在某个类中放置一个正确的位置,或者以正确的方式设计一个方法来获取该列表。

所以,这是代码,我推断并尝试更正;请注意,我使用 fields 而不是那些可能是 properties,并且只放那些需要的。

您可能想看看代码中的 cmets。

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();
    }
}

RequestCustomer 可以声明为

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 {
}

不会破坏代码。

【讨论】:

    【解决方案3】:

    _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);
        }
    

    【讨论】:

    • 感谢您的回复,但同样的问题仍然存在,仍在尝试删除相同的ID号。
    • 在原始代码中添加了额外的代码,希望能更好地解释它。现在我正在尝试一些额外的事情,看看我是否能弄清楚,但任何建议都很棒!谢谢!
    • 刚刚在调试时浏览代码,我看到当我看到“_request2.CustID = custID”时,它已经为 custID 分配了相同的 ID 号,但我想它不会将其更改为我们存储在 List 中的数字列表。
    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多