Linq之归类排序问题及group by返回一个具体类的处理
不久之前遇到一个需求,要求对数据根据某些字段归类之后再根据某个字段排序,比如有以下数据
SeqNo | 名称 | 规格 |
110 | 分片式电容 | 分片式 |
110 | 分片式电容 | 分片式 |
66 | 电阻 | 100 |
66 | 电阻 | 100 |
60 | 电阻 | 12 |
50 | 电感 | 120 |
122 | 变压器 | 200 |
122 | 变压器 | 200 |
111 | 333 | 333 |
处理之后的数据是
SeqNo | 名称 | 规格 |
110-1 | 分片式电容 | 分片式 |
110-2 | 分片式电容 | 分片式 |
66-1 | 电阻 | 100 |
66-2 | 电阻 | 100 |
60-1 |
电阻
|
12 |
50-1 | 电感 | 120 |
122-1 | 变压器 | 200 |
122-2 | 变压器 | 200 |
111-1 | 333 | 333 |
挠破头之后相处了以下解决办法
List<A> mainDetails = (from s in details
group s by new { s.DescCn, s.ModelCn, s.SeqNo } into sg
select new A
{
DescCn = sg.Key.DescCn,
ModelCn = sg.Key.ModelCn,
SeqNo = sg.Key.SeqNo
}).OrderBy(p => p.SeqNo).ToList();
//归类之后再排序
List<string> seqNoList = mainDetails.Select(p => p.SeqNo).Distinct().ToList();
int i = 1;
List<A> needDetails = new List<A>();
foreach (string item in seqNoList)
{
var centerDetails = mainDetails.Where(p => p.SeqNo == item).ToList();
centerDetails.ForEach(p => p.SeqNo = p.SeqNo + "-" + i++);
needDetails.AddRange(centerDetails);
i = 1;
}
难点:1.因为之前很少用到linq的group by ,所以不知道怎么返回一个具体的类型的类,其实只要在select那里new一个对象A,用List<A>接受就好了
2.排序的话是先找相同的seqNo的个数,再循环复制,ForEach是个好东西,之前没用过,哈哈。