判断一个model的三个属性的值是否为空和相同,结果写了6个判断出来,好多重复的,但是又不知道怎么简化
因为都是循环改o.xxx的值,也不好写通用方法,传值进去改        private static List<CZCombineDN> CheckList(List<CZCombineDN> uploadDataList)
        {
            var SOLDTOCUSTOMERList = uploadDataList.Select(o => o.SOLDTOCUSTOMER.FieldText).Distinct();
            if (SOLDTOCUSTOMERList.Count() > 1)
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.SOLDTOCUSTOMER.CheckResult = false;
                    o.SOLDTOCUSTOMER.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }
            if (SOLDTOCUSTOMERList.Any(x => string.IsNullOrEmpty(x)))
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.SOLDTOCUSTOMER.CheckResult = false;
                    o.SOLDTOCUSTOMER.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }            var DESTINATIONList = uploadDataList.Select(o => o.DESTINATION.FieldText).Distinct();
            if (DESTINATIONList.Count() > 1)
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.DESTINATION.CheckResult = false;
                    o.DESTINATION.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }
            if (DESTINATIONList.Any(x => string.IsNullOrEmpty(x)))
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.DESTINATION.CheckResult = false;
                    o.DESTINATION.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }            var ETADATEList = uploadDataList.Select(o => o.ETADATE.FieldText).Distinct();
            if (ETADATEList.Count() > 1)
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.ETADATE.CheckResult = false;
                    o.ETADATE.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }
            if (ETADATEList.Any(x => string.IsNullOrEmpty(x)))
            {
                uploadDataList.ForEach(o =>
                {
                    o.CheckResult.CheckResult = false;
                    o.ETADATE.CheckResult = false;
                    o.ETADATE.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                });
            }            return uploadDataList;
        }

解决方案 »

  1.   

    foeach一遍 里面if lese判断
      

  2.   

    加if是没问题,但是改o.ETADATE的值,不能传ETADATE进来,然后o.传进来的值=XXX
      

  3.   

    我测试才发现,我好像写的有问题,为什么能达到我的要求var SOLDTOCUSTOMERList = uploadDataList.Select(o => o.SOLDTOCUSTOMER.FieldText).Distinct();
    //这个判断不相等就全部标记为false,这个是对的
                if (SOLDTOCUSTOMERList.Count() > 1)
                {
                    uploadDataList.ForEach(o =>
                    {
                        o.CheckResult.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                    });
                }
    //这个先判断为空,然后循环按理说应该是全部都标记了false才对,结果只有为空的标记了是为什么,虽然我想要的确实是这个效果
                if (SOLDTOCUSTOMERList.Any(x => string.IsNullOrEmpty(x)))
                {
                    uploadDataList.ForEach(o =>
                    {
                        o.CheckResult.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                    });
                }
      

  4.   

    是我看错了,改为list.Where(a => string.IsNullOrEmpty(a.DESTINATION.FieldText)).ToList().ForEach()
      

  5.   

    每段中的这个代码,是可以封装成方法的
    uploadDataList.ForEach(o =>
                    {
                        o.CheckResult.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckResult = false;
                        o.SOLDTOCUSTOMER.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = GlobalizationHelper.GetMessage("XXXXX") });
                    });不同之处在于,每段中,有所不同:
    o.SOLDTOCUSTOMER
    o.DESTINATION
    o.ETADATE也简单,把这三个属性,从统一的接口继承,此接口包含CheckResult ,CheckMsg属性。最后,方法传入uploadDataList,而方法本身参数,使用接口
      

  6.   

    主要觉得可复用性太差,假如再增加两个栏位,我又要复制修改,会写的很长。而且复制修改这种很不好,容易改漏导致程式bug
      

  7.   

    这些属性都是CheckData这个class,CheckData有CheckResult 和CheckMsg等属性
      

  8.   

    这些属性都是CheckData这个class,CheckData有CheckResult 和CheckMsg等属性对啊,用接口可以解决。可能你没尝试过用接口来泛化类的这种用法,你可以研究研究。
      

  9.   

    我仔细想了下,用接口恐怕也解决不了你的需求。但用反射肯定可以(就是用参数传递字属性名字符串进去,在封装方法里找属性,反射出来再赋值)。当然反射效率低一点。最后可能是这样的:        private static List<CZCombineDN> CheckList(List<CZCombineDN> uploadDataList)
            {
                var SOLDTOCUSTOMERList = uploadDataList.Select(o => o.SOLDTOCUSTOMER.FieldText).Distinct();
                if (SOLDTOCUSTOMERList.Count() > 1)
                {
    Fun( uploadDataList, "SOLDTOCUSTOMER");
                }
                if (SOLDTOCUSTOMERList.Any(x => string.IsNullOrEmpty(x)))
                {
    Fun( uploadDataList, "SOLDTOCUSTOMER");
                }
     
                var DESTINATIONList = uploadDataList.Select(o => o.DESTINATION.FieldText).Distinct();
                if (DESTINATIONList.Count() > 1)
                {
    Fun( uploadDataList, "DESTINATION");
                }
                if (DESTINATIONList.Any(x => string.IsNullOrEmpty(x)))
                {
    Fun( uploadDataList, "DESTINATION");
                }
     
                var ETADATEList = uploadDataList.Select(o => o.ETADATE.FieldText).Distinct();
                if (ETADATEList.Count() > 1)
                {
    Fun( uploadDataList, "ETADATE");
                }
                if (ETADATEList.Any(x => string.IsNullOrEmpty(x)))
                {
    Fun( uploadDataList, "ETADATE");
                }
     
                return uploadDataList;
            }