这段代码要怎么优化,linq的

-一个大坑 2019-11-29 01:24:58
判断一个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;
}
...全文
223 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2019-12-03
  • 打赏
  • 举报
回复
引用 15 楼 圣殿骑士18 的回复:
还可以再优化,完全不用字符串,用强类型替代
public void Fun(List<UploadData> uploadDataList)
        {
            
            uploadDataList.ForEach(o =>
            {
                o.CheckResult = false;
                Fun2<SOLDTOCUSTOMER>(o);
            });
        }

        public void Fun2<T>(UploadData ud)
            where T: IGen
        {
            string propName = typeof(T).Name;
            IGen obj = ud.GetPropertyValue(propName) as IGen;
            

            obj.CheckResult = false;
            obj.CheckMsg.Add(new CheckMsg() { MsgType = "Failure", Msg = "xxxx" });
        }
用强类型我还要建class,更麻烦,就用string代替了

        public void Fun(List<CZCombineDN> uploadDataList,string strName)
        {
            strName = "DESTINATION";
            var list = uploadDataList.Select(a => a.DESTINATION).ToList(); //这个判断的DESTINATION要怎么定义变量替换?还是说可以设置特性根据特性怎么处理,比如DESTINATION属性上有NoEqualityAttribute
            if (list.Count() > 0)
            {
                uploadDataList.ForEach(o =>
                {
                    Fun2<FieldCheck>(o, strName);
                });
            }
        }

        public void Fun2<T>(CZCombineDN ud, string propName) where T : FieldCheck
        {
            FieldCheck data = (FieldCheck)ud.GetType().GetProperty(propName).GetValue(ud, null);

            data.CheckResult = false;
            data.CheckMsg.Add(new CheckMsg() { MsgType = MessageType.Failure, Msg = "xxxx" });
        }
圣殿骑士18 2019-12-02
  • 打赏
  • 举报
回复
还可以再优化,完全不用字符串,用强类型替代
public void Fun(List<UploadData> uploadDataList)
{

uploadDataList.ForEach(o =>
{
o.CheckResult = false;
Fun2<SOLDTOCUSTOMER>(o);
});
}

public void Fun2<T>(UploadData ud)
where T: IGen
{
string propName = typeof(T).Name;
IGen obj = ud.GetPropertyValue(propName) as IGen;


obj.CheckResult = false;
obj.CheckMsg.Add(new CheckMsg() { MsgType = "Failure", Msg = "xxxx" });
}
圣殿骑士18 2019-12-02
  • 打赏
  • 举报
回复
    public interface IGen
{
bool CheckResult { get; set; }
List<CheckMsg> CheckMsg { get; set; }
}


public class SOLDTOCUSTOMER : IGen
{
public bool CheckResult { get; set; }
public List<CheckMsg> CheckMsg { get; set; }
}


 public class Test
{
public void Run()
{
List<UploadData> uploadDataList = new List<UploadData>();
Fun(uploadDataList);
}
public void Fun(List<UploadData> uploadDataList)
{

uploadDataList.ForEach(o =>
{
o.CheckResult = false;
Fun2<SOLDTOCUSTOMER>(o, "SOLDTOCUSTOMER");
});
}

public void Fun2<T>(UploadData ud, string propName)
where T: IGen
{
IGen obj = ud.GetPropertyValue(propName) as IGen;

obj.CheckResult = false;
obj.CheckMsg.Add(new CheckMsg() { MsgType = "Failure", Msg = "xxxx" });
}
}
-一个大坑 2019-12-02
  • 打赏
  • 举报
回复
引用 12 楼 圣殿骑士18 的回复:
我仔细想了下,用接口恐怕也解决不了你的需求。但用反射肯定可以(就是用参数传递字属性名字符串进去,在封装方法里找属性,反射出来再赋值)。当然反射效率低一点。最后可能是这样的:
        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;
        }
可以说下Fun里面怎么写吗? 虽然知道Fun里是根据反射取属性名称,判断和传的值相等,但是list的ForEach还是不知道怎么写
 T t = new T();
// 获得此模型的公共属性 
 PropertyInfo[] propertys = t.GetType().GetProperties();
 foreach (PropertyInfo pi in propertys){
FieldCheck data = (FieldCheck)pi.GetValue(item, null);
string resourceKey = pi.Name;
 if (resourceKey == "传入的值")
{
这里怎么写?
}
}
-一个大坑 2019-11-30
  • 打赏
  • 举报
回复
引用 7 楼 圣殿骑士18 的回复:
每段中的这个代码,是可以封装成方法的 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,而方法本身参数,使用接口
这些属性都是CheckData这个class,CheckData有CheckResult 和CheckMsg等属性
-一个大坑 2019-11-30
  • 打赏
  • 举报
回复
引用 6 楼 zerocoin 的回复:
就你的逻辑而言,这么写没有什么不妥的。写代码,这类流程化逻辑不需要刻意的追求精减,你要想,你都花时间写出那么多代码了,功能也实现了,性能也没差。何必把自己的代码否定了,想尽办法去找个所谓精减的代码?得不偿失啊。
目前入职的这个公司,这样的写法很多,它就是需要把上传的栏位进行判断,标记成功或失败,以及失败后的提示信息。 如果能简化对以后写判断比较方便,不然就只能每次复制修改
-一个大坑 2019-11-30
  • 打赏
  • 举报
回复
引用 6 楼 zerocoin 的回复:
就你的逻辑而言,这么写没有什么不妥的。写代码,这类流程化逻辑不需要刻意的追求精减,你要想,你都花时间写出那么多代码了,功能也实现了,性能也没差。何必把自己的代码否定了,想尽办法去找个所谓精减的代码?得不偿失啊。
主要觉得可复用性太差,假如再增加两个栏位,我又要复制修改,会写的很长。而且复制修改这种很不好,容易改漏导致程式bug
圣殿骑士18 2019-11-30
  • 打赏
  • 举报
回复
我仔细想了下,用接口恐怕也解决不了你的需求。但用反射肯定可以(就是用参数传递字属性名字符串进去,在封装方法里找属性,反射出来再赋值)。当然反射效率低一点。最后可能是这样的:

        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;
        }
圣殿骑士18 2019-11-30
  • 打赏
  • 举报
回复
引用 10 楼 -一个大坑 的回复:
[quote=引用 7 楼 圣殿骑士18 的回复:]
每段中的这个代码,是可以封装成方法的
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,而方法本身参数,使用接口

这些属性都是CheckData这个class,CheckData有CheckResult 和CheckMsg等属性[/quote]

对啊,用接口可以解决。可能你没尝试过用接口来泛化类的这种用法,你可以研究研究。
圣殿骑士18 2019-11-30
  • 打赏
  • 举报
回复
每段中的这个代码,是可以封装成方法的
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,而方法本身参数,使用接口

zerocoin 2019-11-29
  • 打赏
  • 举报
回复
就你的逻辑而言,这么写没有什么不妥的。写代码,这类流程化逻辑不需要刻意的追求精减,你要想,你都花时间写出那么多代码了,功能也实现了,性能也没差。何必把自己的代码否定了,想尽办法去找个所谓精减的代码?得不偿失啊。
-一个大坑 2019-11-29
  • 打赏
  • 举报
回复
是我看错了,改为list.Where(a => string.IsNullOrEmpty(a.DESTINATION.FieldText)).ToList().ForEach()
-一个大坑 2019-11-29
  • 打赏
  • 举报
回复
引用 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") });
                });
            }
正怒月神 版主 2019-11-29
  • 打赏
  • 举报
回复
感觉也不用可以去优化它
-一个大坑 2019-11-29
  • 打赏
  • 举报
回复
引用 1 楼 看遍这世间的繁华 的回复:
foeach一遍 里面if lese判断
加if是没问题,但是改o.ETADATE的值,不能传ETADATE进来,然后o.传进来的值=XXX
  • 打赏
  • 举报
回复
foeach一遍 里面if lese判断

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧