2017-02-23 83 views
0

我需要通過從一個列表中獲取值並檢查它是否存在於另一列表中,以在JSON輸入模型上運行驗證。這個值是從1到5的等級。如果沒有匹配的數字,那麼它應該拋出一個錯誤。下面是代碼,這邏輯是與註釋部分://檢查評級得分表中存在C#通過映射多個列表的值驗證模型

namespace Alpha.Model 
{ 
    // INPUT 
    public class AlphaCalcParamMethod 
    {  
     public ICollection<PortfolioInputModel> portfolios { get; set; } 
     public Setting settings { get; set; } 

     public bool Validation(ref string errString) 
     { 
      // Check if portfolio exists 
      if(portfolios == null || portfolios.Count < 1) 
      { 
       errString = "At least 1 Portfolio."; 
       return false; 
      } 
      //check if weight adds upto 1 
      foreach(var portfolio in portfolios) 
      { 
       // var holdings = new List<PortfolioHoldingInput>(); 
       var weightAggregator = 0.00; 
       foreach(var holding in portfolio.portfolioHoldings) 
       { 
        weightAggregator += holding.fundWeight; 
       } 
       if (weightAggregator != 1) 
       { 
        errString = "Fund Weights should add upto 1"; 
       } 
       return false; 
      } 
      //check if rating exist in score table 
      foreach(var portfolio in portfolios) 
      { 
       var holdings = new List<PortfolioHoldingInput>(); 
       var scores = new List<Setting>(); 

       foreach(var holding in holdings) 
       { 
        //fetch the value of fundRating double 
        foreach(var score in scores) 
        { 
         //check if the value above exist in grossAlpha's List fundRating 
         // if it doesn't return false 
        } 
       } 
       return false; 
      } 
      return true; 
     } 

    } 

    // OUTPUT 
    public class AlphaCalcResultMethod 
    { 
     public List<PortfolioOutputModel> portfolios { get; set; } 
    } 

    public class PortfolioInputModel 
    { 
     public string portfolioIdentifier { get; set; } 
     public ICollection<PortfolioHoldingInput> portfolioHoldings { get; set; } 
    } 

    public class PortfolioOutputModel 
    { 
     public string portfolioIdentifier { get; set; } 
     public double portfolioAlpha { get; set; } 
     public ICollection<PortfolioHoldingOutput> portfolioHoldings { get; set; } 
    } 
    public class PortfolioHoldingInput 
    { 
     public string fundIdentifier { get; set; } 
     public int fundRating { get; set; } 
     public double fundExpenseRatio { get; set; } 
     public double fundWeight { get; set; } 
    } 
    public class PortfolioHoldingOutput 
    { 
     public string fundIdentifier { get; set; } 
     public int fundRating { get; set; } 
     public double fundExpenseRatio { get; set; } 
     public double fundWeight { get; set; } 
     public double fundAlpha { get; set; } 
    } 
    public class Setting 
    { 
     public List<GrossAlpha> grossAlphas { get; set; } 
    } 

    public class GrossAlpha 
    { 
     public int fundRating { get; set; } 
     public double grossAlpha { get; set; } 
    } 
} 
+0

爲什麼錯誤字符串由'ref'傳遞?你將從驗證方法中返回它,所以它應該是'out'參數 –

+0

兩個嵌套'foreach'(for''''和'scores')將不會由於空列表而被執行。這是你的意思? – KernelMode

+0

目前還不清楚你想用分數來驗證你的想法。 grossAlpha在評論 –

回答

2
  1. 如果您要從方法返回附加值,則應使用out參數。
  2. 請勿指定變量名稱中的變量類型。即而不是errorString只是使用error。現代IDE不需要匈牙利符號和其他技巧。
  3. 雙重類型不準確。您應該避免將其與整數值相比較。比較大於或小於比較。
  4. 使用LINQ來代替循環
  5. 方法名稱Validation是一個名詞。這是相當混亂的方法是行動,應該是一個動詞。考慮其重命名爲ValidateIsValid

代碼

public bool IsValid(out string error) 
{ 
    if (portfolios?.Any() == false) 
    { 
     error = "At least 1 Portfolio."; 
     return false; 
    } 

    if (portfolios.Any(p => p.portfolioHoldings.Sum(h => h.fundWeight) < 1)) 
    { 
     error = "Fund Weights should add upto 1"; 
     return false; 
    } 

    var holdings = portfolios.SelectMany(p => p.portfolioHoldings); 
    var validRatings = new List<int> { 1, 2, 3, 4, 5 }; 

    if (holdings.Any(h => !validRatings.Contains(h.fundRating))) 
    { 
     error = "Fund ratings should be in " + String.Join(",", validRatings); 
     return false; 
    } 

    error = ""; 
    return true; 
} 

注:如果有效的評級是連續號碼,那麼你可以檢查fundRating值範圍:

if (holdings.Any(h => h.fundRating < 1 || 5 < h.fundRating)) 
+0

中提到的地方是否有任何理由使用'out'和'ref'?編輯 - 猜我應該只是GOOGLE了它。這裏有一個答案,爲什麼你應該使用'out' http://stackoverflow.com/questions/1516876/when-to-use-ref-vs-out –

+0

是的,'ref'需要錯誤信息被調用者初始化,它表明參數的值與被調用的方法有關。這裏的錯誤信息是不正確的。 'out'不需要在調用者端進行初始化,並且顯示該方法將完成與分配錯誤消息 –

+0

有關的所有工作var validRatings = new List {1,2,3,4,5};有沒有辦法動態檢查值?我知道它是1到5,但不想假設。 –

1

看看這個代碼:

if(!score.grossAlphas.Exists(x => x.fundRating == holding.fundRating)) 
{ 
    return false; 
} 

它檢查是否存在grossAlphas與fundRating等於持有.fundRating。

把它放在你想檢查的循環中,讓我知道它是否是你想要的,如果它工作。