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; }
}
}

运行。

BjYRJf.png

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

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

q6B7ni.png

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

 

0 0