C#通过映射多个列表的值来验证模型

C#通过映射多个列表的值来验证模型,c#,json,C#,Json,我需要通过从一个列表中获取值并检查它是否存在于另一个列表中来对JSON输入模型运行验证。该值是从1到5的额定值。如果没有匹配的号码,那么它应该抛出一个错误。下面是代码,该逻辑在注释为://检查评分表中是否存在评分的部分中使用 namespace Alpha.Model { // INPUT public class AlphaCalcParamMethod { public ICollection<PortfolioInputModel>

我需要通过从一个列表中获取值并检查它是否存在于另一个列表中来对JSON输入模型运行验证。该值是从1到5的额定值。如果没有匹配的号码,那么它应该抛出一个错误。下面是代码,该逻辑在注释为://检查评分表中是否存在评分的部分中使用

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; }
    }
}
名称空间Alpha.Model
{
//输入
公共类AlphaCalcParamMethod
{     
公共ICollection公文包{get;set;}
公共设置设置{get;set;}
公共布尔验证(参考字符串errString)
{
//检查投资组合是否存在
如果(公文包==null | |公文包.计数<1)
{
errString=“至少1个投资组合。”;
返回false;
}
//检查重量是否增加到1
foreach(组合中的var组合)
{
//var holdings=新列表();
var权重聚合器=0.00;
foreach(投资组合中的var持有。投资组合持有)
{
权重聚合器+=持有.fundWeight;
}
if(权重聚合器!=1)
{
errString=“基金权重应加至1”;
}
返回false;
}
//检查评分表中是否存在评分
foreach(组合中的var组合)
{
var holdings=新列表();
var分数=新列表();
foreach(持有的风险值)
{
//获取fundRating double的值
foreach(分数中的var分数)
{
//检查格罗萨尔法基金评级列表中是否存在上述值
//如果没有返回false
}
}
返回false;
}
返回true;
}
}
//输出
公共类AlphaCalcResultMethod
{
公共列表组合{get;set;}
}
公共类PortfolioInput模型
{
公共字符串PortfolioId标识符{get;set;}
公共ICollection portfolioHoldings{get;set;}
}
公共类PortfolioOutputModel
{
公共字符串PortfolioId标识符{get;set;}
公共双端口组合alpha{get;set;}
公共ICollection portfolioHoldings{get;set;}
}
公共类PortfolioHoldingInput
{
公共字符串标识符{get;set;}
公共int基金评级{get;set;}
公共双基金支出比率{get;set;}
公共双基金权重{get;set;}
}
公共类PortfolioHoldingOutput
{
公共字符串标识符{get;set;}
公共int基金评级{get;set;}
公共双基金支出比率{get;set;}
公共双基金权重{get;set;}
公共双基金α{get;set;}
}
公共班级设置
{
公共列表grossalpha{get;set;}
}
公共级罗莎尔法酒店
{
公共int基金评级{get;set;}
公共双grossAlpha{get;set;}
}
}
查看以下代码:

if(!score.grossAlphas.Exists(x => x.fundRating == holding.fundRating))
 {
   return false;
 }
它检查是否存在资金评级等于holding.Fundsalrating的Grossalpha

把它放在你想检查的循环中,让我知道它是否是你想要的,是否有效

看看下面的代码:

if(!score.grossAlphas.Exists(x => x.fundRating == holding.fundRating))
 {
   return false;
 }
它检查是否存在资金评级等于holding.Fundsalrating的Grossalpha

把它放在你想检查的循环中,让我知道它是否是你想要的,是否有效

  • 若要从方法返回附加值,则应使用
    out
    参数
  • 不要在变量名中指定变量的类型。也就是说,不要使用
    errorString
    ,只需使用
    error
    。现代IDE不需要匈牙利符号和其他技巧
  • 双重类型不精确。您应该避免将其与相等的整数值进行比较。喜欢大于或小于比较
  • 使用LINQ替换循环
  • 方法名
    Validation
    是一个名词。这对于方法来说是相当混乱的,它是动作,应该是动词。考虑将其重命名为<代码>验证< /代码>或<代码> IsValid < /代码>
  • 代码

    public bool有效(输出字符串错误)
    {
    if(公文包?.Any()==false)
    {
    error=“至少1个投资组合。”;
    返回false;
    }
    如果(组合.Any(p=>p.portfolioHoldings.Sum(h=>h.fundWeight)<1))
    {
    error=“基金权重应加至1”;
    返回false;
    }
    var holdings=投资组合。SelectMany(p=>p.portfolioHoldings);
    var validRatings=新列表{1,2,3,4,5};
    if(holdings.Any(h=>!validRatings.Contains(h.fundRating)))
    {
    error=“基金评级应为“+字符串.连接(,”,validRatings);
    返回false;
    }
    错误=”;
    返回true;
    }
    
    注意:如果有效评级是连续数字,则您可以只检查fundRating值的范围:

      if (holdings.Any(h => h.fundRating < 1 || 5 < h.fundRating))
    
    if(holdings.Any(h=>h.fundRating<1 | | 5
  • 若要从方法返回附加值,则应使用
    out
    参数
  • 不要在变量名中指定变量的类型。也就是说,不要使用
    errorString
    ,只需使用
    error
    。现代IDE不需要匈牙利符号和其他技巧
  • 双重类型不精确。您应该避免将其与相等的整数值进行比较。喜欢大于或小于比较
  • 使用LINQ替换循环
  • 方法名
    Validation
    是一个名词。这对于方法来说是相当混乱的,它是动作,应该是动词。考虑将其重命名为<代码>验证< /代码>或<代码> IsValid < /代码>
  • 代码

    public bool有效(输出字符串错误)
    {