2017-02-23 85 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。

把它放在你想检查的循环中,让我知道它是否是你想要的,如果它工作。