2013-03-11 77 views
1

我有一個方法,搜索具有相同公司名稱的所有客戶的數據庫,然後返回他們的ID號列表,現在我將它們保存到文本文件,所以我可以確認它的工作。循環刪除列表中的多個項目... c#

但是我遇到的問題是訪問該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; 
} 
+0

cancelRequest執行刪除操作。我不必手動編寫代碼。這是一個自動生成的對象。 – CSharpDev4Evr 2013-03-11 15:48:15

+0

@GrantThomas推測取消請求的集合通過其他方法發送到服務器。重點在於,OP不知道如何做的唯一的事情就是創建取消對象;他有能力使用他們實際上自己刪除數據。 – Servy 2013-03-11 16:01:07

回答

0

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

感謝您的回覆,但同樣的問題仍在發生,仍然試圖刪除相同的ID號碼。 – CSharpDev4Evr 2013-03-11 16:05:41

+0

增加了額外的代碼給原文,希望能更好地解釋它。現在我正在嘗試一些額外的東西,看看我能否弄清楚,但任何建議都很棒!謝謝! – CSharpDev4Evr 2013-03-11 16:15:40

+0

只是在我調試的時候通過代碼,我看到當我看到'_request2.CustID = custID'時,它已經爲custID分配了相同的ID號碼,但我想它不會將它更改爲我們存儲在名單。 – CSharpDev4Evr 2013-03-11 16:19:50

4

正在重用_request2場。

List<CancelRequest> _cancelRequests; 

然後創建和所有的請求添加到這個列表:不是存儲在單場取消請求,請求使用清單

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

和處理這些請求一一之後。

+0

這是什麼'_request.Company'? – IronMan84 2013-03-11 15:43:51

+0

@ IronMan84已經刪除,思考... – 2013-03-11 15:44:10

+1

@ IronMan84這是什麼OP使用。如果這不是它應該的,我們不知道該在哪裏。 – Servy 2013-03-11 15:44:16

1

似乎您的問題不會直接發生在列表中,因爲您的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(); 
    } 
} 

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

不會打破代碼。