我正在撰寫單元測驗,以將原始回應與使用請求物件作為引數的過濾回應進行比較。這樣做時,我注意到如果我在收到回應后更改請求物件,IEnumerable 串列將會更改 - 當我鍵入此內容時,我的想法是,因為它是帶有 LINQ 的 IEnumerable,所以該request.Filter屬性是 LINQ 查詢中的參考,它是導致這種行為的原因。如果我將其轉換為串列而不是 IEnumerable,我懷疑該行為會消失,因為.ToList()它將評估 LINQ 運算式而不是延遲。是這樣嗎?
public class VendorResponse {
public IEnumerable<string> Vendors { get; set; }
}
var request = new VendorRequest() {
Filter = ""
};
var response = await _service.GetVendors(request);
int vendorCount = response.Vendors.Count(); // 20
request.Filter = "at&t";
int newCount = response.Vendors.Count(); // 17
public async Task<VendorResponse> GetVendors(VendorRequest request)
{
var vendors = await _dataService.GetVendors();
return new VendorResponse {
Vendors = vendors.Where(v => v.IndexOf(request.Filter) >= 0)
}
}
uj5u.com熱心網友回復:
request.Filter如果延遲執行更可取,您可以使用區域變數捕獲 的當前狀態并在Where謂詞中使用它
public async Task<VendorResponse> GetVendors(VendorRequest request)
{
var filter = request.Filter;
var vendors = await _dataService.GetVendors();
return new VendorResponse {
Vendors = vendors.Where(v => v.IndexOf(filter) >= 0)
}
}
uj5u.com熱心網友回復:
是的!
這是一個延遲執行IEnumerable 的示例,它只是封裝了對某些資料的查詢,而不封裝該查詢的結果。
一個 IEnumerable 可以被列舉(通過它的 IEnumerator),并且“知道”如何列舉它封裝的查詢,但這實際上不會發生,直到某些東西執行了列舉。
在您的情況下,列舉由呼叫執行,該呼叫.Count()需要知道查詢結果中有多少項。每次呼叫時都會進行列舉.Count(),因此更改兩次呼叫之間的過濾器會導致您獲得兩個不同的結果。
正如您正確推斷的那樣,在執行任何進一步操作之前呼叫.ToList()和捕獲變數中的結果將導致您捕獲結果資料而不是查詢,因此導致兩個計數具有相同的值。
自己試試這個。將來,請務必在傳遞給其他查詢或回傳未知代碼之前強制對可列舉進行評估,否則您或您的用戶將遇到意外行為和可能的性能問題。
希望這可以幫助 :)
編輯 1:正如Moho 所指出的,并且您在原始帖子中也提到過,這也是request.Filter被 IEnumerable 作為參考型別捕獲的結果。如果您可以捕獲該值并將其傳入,則 IEnumerable 的結果將不再通過更改過濾器來修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522815.html
標籤:C#林克不可数
上一篇:C#LINQ-回圈串列
