• ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现


    在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在。接着,把CheckBoxList的选中项组合生成产品SKU项。

     

    本系列将在ASP.NET MVC中实现以上功能。但本篇,先在控制台实现属性值的笛卡尔乘积。

     

    关于属性的类:

        public class Prop
    
        {
    
            public int Id { get; set; }
    
            public string Name { get; set; }
    
        }

     

    关于属性项的类:

        public class PropOption
    
        {
    
            public int Id { get; set; }
    
            public string RealValue { get; set; } //存储属性值
    
            public int PropId { get; set; }
    
        }    

     

    通过几个方法模拟有关属性和属性项的数据。

            static List<Prop> GetProps()
    
            {
    
                return new List<Prop>()
    
                {
    
                    new Prop(){Id = 1, Name = "颜色"},
    
                    new Prop(){Id = 2, Name = "尺寸"}
    
                };
    
            }
    
            static List<PropOption> GetPropOptions() 
    
            {
    
                return new List<PropOption>()
    
                {
    
                      new PropOption(){Id = 1, RealValue = "红色", PropId = 1},
    
                      new PropOption(){Id = 2, RealValue = "蓝色", PropId = 1},
    
                      new PropOption(){Id = 3, RealValue = "橙色", PropId = 1},
    
                      new PropOption(){Id = 4, RealValue = "5英寸", PropId = 2},
    
                      new PropOption(){Id = 5, RealValue = "8英寸", PropId = 2},
    
                      new PropOption(){Id = 6, RealValue = "10英寸", PropId = 2},
    
                };
    
            }
    
            static string GetValueByPropOptionId(int id)
    
            {
    
                return (GetPropOptions().Where(p => p.Id == id).FirstOrDefault()).RealValue;
    
            }
    

    以上,
    GetProps方法获取所有属性
    GetPropOptions方法获取所有属性值
    GetValueByPropOptionId方法根据属性项的Id获取属性值

     

    接下来,可能就是在前台勾选CheckBoxList的项,把属性Id和对应的属性项Id封装成PropAndOption类。

        public class PropAndOption
    
        {
    
            public int PropId { get; set; }
    
            public int OptionId { get; set; }
    
        }


    在服务端拿到的PropAndOption对象集合假设是这样的:

                //从前端获取的所有属性Id和属性项Id
    
                var tempList = new List<PropAndOption>()
    
                {
    
                    new PropAndOption(){PropId = 1, OptionId = 1},
    
                    new PropAndOption(){PropId = 1, OptionId = 2},
    
                    new PropAndOption(){PropId = 1, OptionId = 3},
    
                    new PropAndOption(){PropId = 2, OptionId = 4},
    
                    new PropAndOption(){PropId = 2, OptionId = 5},
    
                    new PropAndOption(){PropId = 2, OptionId = 6}
    
                };

     

    接着,把List<PropAndOption>集合以PropId为分组标准,分成2组:

                //根据属性Id分组,并得到属性值的分组
    
                var groupTempList = (from item in tempList
    
                    group item by item.PropId
    
                    into grp
    
                    select grp.Select(t => GetValueByPropOptionId(t.OptionId))).ToList();

     

    于是,得到类似如下的结果:

     

    组1:
    红色
    蓝色
    橙色

     

    组2:
    5英寸
    8英寸
    10英寸

     

    接着,把组1和组2进行笛卡尔乘积,我们的目的是想得到类似如下的string类型的集合:

     

    红色 5英寸
    红色 8英寸
    红色 10英寸

     

    以下声明一个string集合类型变量result

                IEnumerable<string> result;
    
                result = groupTempList.First();
    
                groupTempList.RemoveAt(0);
    
                groupTempList.ForEach(delegate(IEnumerable<string> value)
    
                {
    
                    result = (from r in result
    
                        from v in value
    
                        select r + " " + v).ToList();
    
                });

     

    最后遍历result这个字符串类型的集合。

                foreach (var item in result)
    
                {
    
                    Console.WriteLine(item);
    
                }

     

    完整的代码为:

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    namespace ConsoleApplication1
    
    {
    
        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                //从前端获取的所有属性Id和属性项Id
    
                var tempList = new List<PropAndOption>()
    
                {
    
                    new PropAndOption(){PropId = 1, OptionId = 1},
    
                    new PropAndOption(){PropId = 1, OptionId = 2},
    
                    new PropAndOption(){PropId = 1, OptionId = 3},
    
                    new PropAndOption(){PropId = 2, OptionId = 4},
    
                    new PropAndOption(){PropId = 2, OptionId = 5},
    
                    new PropAndOption(){PropId = 2, OptionId = 6}
    
                };
    
                //根据属性Id分组,并得到属性值的分组
    
                var groupTempList = (from item in tempList
    
                    group item by item.PropId
    
                    into grp
    
                    select grp.Select(t => GetValueByPropOptionId(t.OptionId))).ToList();
    
                IEnumerable<string> result;
    
                result = groupTempList.First();
    
                groupTempList.RemoveAt(0);
    
                groupTempList.ForEach(delegate(IEnumerable<string> value)
    
                {
    
                    result = (from r in result
    
                        from v in value
    
                        select r + " " + v).ToList();
    
                });
    
                foreach (var item in result)
    
                {
    
                    Console.WriteLine(item);
    
                }
    
                
    
                Console.ReadKey();
    
            }
    
            static List<Prop> GetProps()
    
            {
    
                return new List<Prop>()
    
                {
    
                    new Prop(){Id = 1, Name = "颜色"},
    
                    new Prop(){Id = 2, Name = "尺寸"}
    
                };
    
            }
    
            static List<PropOption> GetPropOptions() 
    
            {
    
                return new List<PropOption>()
    
                {
    
                      new PropOption(){Id = 1, RealValue = "红色", PropId = 1},
    
                      new PropOption(){Id = 2, RealValue = "蓝色", PropId = 1},
    
                      new PropOption(){Id = 3, RealValue = "橙色", PropId = 1},
    
                      new PropOption(){Id = 4, RealValue = "5英寸", PropId = 2},
    
                      new PropOption(){Id = 5, RealValue = "8英寸", PropId = 2},
    
                      new PropOption(){Id = 6, RealValue = "10英寸", PropId = 2},
    
                };
    
            }
    
            static string GetValueByPropOptionId(int id)
    
            {
    
                return (GetPropOptions().Where(p => p.Id == id).FirstOrDefault()).RealValue;
    
            }
    
        }
    
        public class Prop
    
        {
    
            public int Id { get; set; }
    
            public string Name { get; set; }
    
        }
    
        public class PropOption
    
        {
    
            public int Id { get; set; }
    
            public string RealValue { get; set; }
    
            public int PropId { get; set; }
    
        }
    
        public class PropAndOption
    
        {
    
            public int PropId { get; set; }
    
            public int OptionId { get; set; }
    
        }
    
    }
    

    运行。

    1

     

    如果在服务端只收到一个属性Id和属性项Id组成的PropAndOptio对象。

                var tempList = new List<PropAndOption>()
    
                {
    
                    new PropAndOption(){PropId = 1, OptionId = 1}
    
                };

    2

    在下一篇,将在ASP.NET MVC中实现属性值的笛卡尔乘积。

     

     

  • 相关阅读:
    sort()的部分用法
    蓝桥杯 算法训练 审美课
    蓝桥杯 基础练习 查找整数
    2018年第九届蓝桥杯【C++省赛B组】【第二题:明码】
    蓝桥杯 特殊回文数
    比较两文本程序
    蓝桥杯 基础练习 十六进制转八进制
    Python | 用Pyinstaller打包发布exe应用
    SpringBoot-04-整合JDBC
    SpringBoot-03-自定义Starter
  • 原文地址:https://www.cnblogs.com/darrenji/p/4104015.html
Copyright © 2020-2023  润新知