在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以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; }
    }

}


运行。

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

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

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

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现的更多相关文章

  1. ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现

    在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面 ...

  2. 关于ASP.NET MVC 中JsonResult返回的日期值问题

    最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...

  3. ASP.Net MVC 中EF实体的属性取消映射数据库、自定义名称

    例如:数据库中一个字段名称为CompanyId 自定义实体数据名称 [Column("CompanyId")] public int Id{ get; set; } 这样就可以使用 ...

  4. ASP.NET MVC中商品模块小样

    在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...

  5. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  6. 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个中两个属性值的比较验证 具体应用场景为:要对两个属性值的大小进行验证 代码如下所示: /// ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  8. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

随机推荐

  1. linux backtrace()详细使用说明,分析Segmentation fault【转】

    转自:http://velep.com/archives/1032.html 在此之前,开发eCos应用程序时,经常碰到程序挂掉后,串口打印输出一大串让人看不懂的数据.今天才明白,原来这些数据是程序挂 ...

  2. 【Hadoop】搭建完全分布式的hadoop【转】

    转自:http://www.cnblogs.com/laov/p/3421479.html 下面博文已更新,请移步 ↑ 用于测试,我用4台虚拟机搭建成了hadoop结构 我用了两个台式机.一个xp系统 ...

  3. css初始化minireset.css

    一个很小的现代CSS重置,涵盖了基本内容: 重置字体大小:这样使用语义标记不会影响样式 重置块边距:所以只有在需要时才应用间距 重置表格:这样表格数据只占用它所需的空间 保留了行内间距:因此,按钮和输 ...

  4. Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息

    pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch& ...

  5. HTTP2.0新特性

    参考:http://www.tuicool.com/articles/mq2qm26

  6. mac OS配置用户全局环境变量(设置字符集为UTF8)

    mac OS系统跟linux系统一样也是将用户的全局环境变量保存在.bash_profile配置文件中,只是mac OS默认没有此文件. 1.创建.bash_profile文件 vi ~/.bash_ ...

  7. Laravel 生成二维码的方法

    (本实例laravel 版本 >=5.6, PHP版本 >=7.0) 1.首先,添加 QrCode 包添加到你的 composer.json 文件的 require 里: "re ...

  8. PHP操作Redis常用

    一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...

  9. IOC创建对象的几种方式

    接上一篇IOC入门 IOC创建对象的几种方式 1)调用无参数构造器 2)带参数构造器 3)工厂创建对象 工厂类:静态方法创建对象 工厂类:非静态方法创建对象 1.对之前的User类进行一些修改,加上一 ...

  10. Qt编程之悲惨世界

    最近需要给人写点基于QtWebkit的代码,算是领教了Qt编程的痛苦之处. QNetworkConfigurationManager::isOnline() 只有在编译平台上能运行,拷贝到其他Wind ...