2013-07-19 83 views
1

獲取添加我有一個名爲估計類,它具有以下字段和屬性:元素不在列表中

private IList<RouteInformation> _routeMatrix; 
public virtual IList<RouteInformation> RouteMatrix 
{ 
    get 
    { 
     if (_routeMatrix != null && _routeMatrix.Count > 0) 
     { 
      var routeMatrix = _routeMatrix.ToList(); 
      routeMatrix = 
        routeMatrix.OrderBy(tm => tm.Level.LevelType).ThenBy(tm => tm.Level.LevelValue).ToList(); 
      return routeMatrix; 
     } 
     else return _routeMatrix; 
    } 
    set { _routeMatrix = value; } 
} 

因此,在getter方法,我只是排序的等級類型,然後_routeMatrix通過級別值並返回排序列表。

以我方案之一,我有以下代碼:

public void SaveApprovers(string[] approvers) 
{ 
    int i = 1; 
    foreach (var approver in approvers) 
    { 
     var role = Repository.Get<Role>(long.Parse(approver)); 
     var level = new Models.Level 
     { 
      LevelType = LevelType.Approver, 
      LevelValue = (LevelValue)i, 
      Role = role 
     }; 
     Repository.Save(level); 
     var routeInformation = new Models.RouteInformation 
     { 
      Level = level, 
      RouteObjectType = RouteObjectType.Estimate, 
      RouteObjectId = _estimate.Id 
     }; 
     Repository.Save(routeInformation); 
     _estimate.RouteMatrix.Add(routeInformation); // <--- The problem is here 
     Repository.Save(_estimate); 
     i++; 
    } 
} 

的問題是,如果有多個批准(即:approvers陣列的長度大於1,只有第一routeInformation被添加到RouteMatrix我不知道其他人會發生什麼,但Add方法不會給出任何錯誤

此前,RouteMatrix是一個公共字段。它是私人的,並將其封裝在一個公共財產。

+0

什麼是var routeMatrix = _routeMatrix.ToList();對於? var routeMatrix = _routeMatrix.OrderBy(tm => tm.Level.LevelType).ThenBy(tm => tm.Level.LevelValue).ToList(); –

回答

2

get成員返回不同列表,您添加到該臨時列表。

get 
{ 
    if (_routeMatrix != null && _routeMatrix.Count > 0) 
    { 
     var routeMatrix = _routeMatrix.ToList(); // ToList creates a _copy_ of the list 
     ... 
     return routeMatrix; 
    } 
    else return _routeMatrix; 
} 

..... 

_estimate.RouteMatrix.Add(routeInformation); // add to the result of ToList() 

我認爲這裏的道德並不是讓吸氣劑太複雜。無論如何,當你只是想添加()時,排序是浪費精力。

另外,壞的事情發生在_routeMatrix == null。這可能不會發生,但那麼if (_routeMatrix != null && ...)部分是誤導性的噪音。

2

當您申請ToList()時,會創建全新的列表,這與列表中的原始_routeMatrix列表無關。那麼,它們共享相同的元素,但是當您從一個列表中添加或刪除元素時,它不會影響第二個列表。

MSDN

您可以將這個方法來查詢,以獲得查詢結果的緩存 副本。

所以,你已經緩存在_routeMatrix您已成功修改的副本


爲了解決這個問題,你可以返回IEnumerable的而不是IList的(禁用估計課堂外收集的修改),並創建AddRouteInformation方法來估算的類將增加路由信息_routeMatrix。使用該方法來添加新的項目:

_estimate.AddRouteInformation(routeInformation); 
Repository.Save(_estimate); 
1

問題是,你實際上沒有修改_routeMatrix,你正在修改它的一個副本。請勿在_routeMatrix上發佈ToList,只需對其進行排序即可。將get更改爲:

get 
{ 
    if (_routeMatrix != null && _routeMatrix.Count > 0) 
    { 
     _routeMatrix = 
       _routeMatrix.OrderBy(tm => tm.Level.LevelType).ThenBy(tm => tm.Level.LevelValue).ToList(); 
     return _routeMatrix; 
    } 
    else return _routeMatrix; 
}