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和属性项Idvar 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 tempListgroup item by item.PropIdinto grpselect 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 resultfrom v in valueselect 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和属性项Idvar 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 tempListgroup item by item.PropIdinto grpselect 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 resultfrom v in valueselect 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, 在控制台实现的更多相关文章
- ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面 ...
- 关于ASP.NET MVC 中JsonResult返回的日期值问题
最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...
- ASP.Net MVC 中EF实体的属性取消映射数据库、自定义名称
例如:数据库中一个字段名称为CompanyId 自定义实体数据名称 [Column("CompanyId")] public int Id{ get; set; } 这样就可以使用 ...
- ASP.NET MVC中商品模块小样
在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...
- 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个中两个属性值的比较验证 具体应用场景为:要对两个属性值的大小进行验证 代码如下所示: /// ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
随机推荐
- 树莓派编译安装opencv3 (2019.1.6更新)
一.更新系统 sudo apt-get update sudo apt-get upgrade sudo rpi-update #重启系统 sudo reboot 二.安装依赖库及程序 sudo ap ...
- SpringMVC_HelloWorld_01
通过配置文件的方式实现一个简单的HelloWorld. 源码 一.新建项目 1.新建动态web项目 2.命名工程springmvc-01 3.勾选"Generate web.xml depl ...
- Android网络框架之Retrofit + RxJava + OkHttp 变化的时代
1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...
- 6. 缓存 - 《APS.NET本质论》
CaChe是ASP.NET中唯一可以根据服务器使用情况,动态管理内存使用的状态管理方案.我们通过每个缓存数据的键值字符串来区分缓存的数据. 简单案例来说.将数据从数据库/文件取出放在服务器内存中,后来 ...
- Java编程的逻辑 (62) - 神奇的序列化
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Java第三阶段学习(九、类加载器、反射)
一.类加载器 1.类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.1 加载: 就是指将class文件读入内存,并为之自动 ...
- zTree搜索
自写 zTree搜索功能 -- 关键字查询 -- 递归无限层 唠叨一哈 前两天朋友跟我说要一个ztree的搜索功能,我劈头就是一巴掌:这种方法难道无数前辈还做少了?自己去找,我很忙~然后我默默地蹲着写 ...
- 迷茫于Hibernate/JPA的人提一些建议。
想对那些“迷惑”于Java ORM框架的J2EE开发人员提一些建议,希望能够对他们 更深入的理解和运用J2EE ORM框架来提速工作有所帮助,这些建议可能显得有些”陈旧“和”肤浅“, 因为最近半年我没 ...
- Codeforces Round #254 (Div. 1) D - DZY Loves Strings
D - DZY Loves Strings 思路:感觉这种把询问按大小分成两类解决的问题都很不好想.. https://codeforces.com/blog/entry/12959 题解说得很清楚啦 ...
- Web安全之跨站脚本攻击(XSS)
XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...