我有一組物件進入一個方法作為IEnumerable其中我按參考屬性對它們進行分組,然后按組處理它們。該處理涉及改變物件的其他屬性。當方法完成并回傳時,呼叫者希望它傳入的物件集合發生變異。整個程序是異步的,方法如下:
public async Task MutateMyObjects(IEnumerable<MyObjects> myObjects,
CancellationToken cancellationToken)
{
var myObjectsGroupedByGroupingEntity = myObjects
.GroupBy(myObject => myObject.GroupingEntity);
foreach (var myObjectGroup in myObjectsGroupedByGroupingEntity )
{
await ProcessGroup(myObjectGroup.Key, myObjectGroup, cancellationToken);
}
}
這兩個MyObject和GroupingEntity是類,因此我希望的是MyObjects的參考型別傳遞和變異是通過工藝所固有的。
實際發生的是s的呼叫者MutateMyObjects觀察MyObject到與方法呼叫之前觀察到的相同的屬性值。Task完成后觀察這些結果。在除錯上述方法時,觀察方法回傳前的變數狀態,發現該變數下的物件集合myObjectGroup包含變異屬性,而該變數下的物件集合myObjects沒有。
我不確定我的理解缺少哪一方面導致我得到錯誤的期望,任何見解將不勝感激。
uj5u.com熱心網友回復:
問題是我需要先執行 LINQ 查詢來具體化物件,然后再將它們發送出去進行變異。問題中沒有顯示的是如何IEnumerable<MyObject> myObjects表示的。就我而言,myObjects是延遲執行通過管道傳輸到物件映射中的資料庫提取。這意味著當我改變物件時,groupBy強制初始化物件,這些物件隨后在顯示的方法回傳時丟失。當“變異”物件被“使用”時,物件實際上被重新初始化。
正如@Enigmativity 所指出的那樣,在此方法中,簽名可能應該要求IList<MyObject>確保物件的存在,因為該方法打算改變它們。這意味著該方法的呼叫者需要在呼叫該方法之前執行任何 LINQ 查詢,從而避免這種陷阱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392400.html
上一篇:使用LINQ按孫子過濾串列
