首页 新闻 会员 周边 捐助

c# list sort多条件排序

0
[已解决问题] 解决于 2019-06-18 10:29

一个结构 有三个参数
Data{ int aa ; int bb; int cc;}
按要求
1.aa 小于
2.aa 等于时 再考虑 bb 小于
3.aa等于时 再考虑 bb等于 再考虑 cc小于
4.最后考虑 aa 大于
5.同理 到bb 和cc
// 伪代码 规则如下
// 其中的 return X 怎么写?
list.sort(data a1 , data a2) =>
{
if (a1.aa < a2.aa)
{
}
else if(a1.aa == a2.aa)
{
if(a1.bb < a2.bb)
{
}
else if (a1.bb == a2.bb)
{
if(a1.cc < a2.cc)
{
}
else if (a1.cc == a2.cc)
{
}
else
{
}
}
else // a1.bb > a2.bb
{
}
}
else // a1.aa > a2.aa
{
}
}

例如:最终排序应该是

  1. aa = 50 bb = 1 cc =50
  2. aa = 50 bb = 1 cc = 51
  3. aa = 50 bb = 3 cc = 50
  4. aa = 52 bb = 1 cc = 52
  5. aa = 52 bb = 1 cc = 53
  6. aa = 53 bb = 1 cc = 51

请大大指教? c#语言!

Nicholas_Mophie的主页 Nicholas_Mophie | 菜鸟二级 | 园豆:206
提问于:2019-05-27 17:10

建议改进一下排版,支持 markdown 代码高亮

dudu 5年前

@dudu: 3Q

Nicholas_Mophie 5年前
< >
分享
最佳答案
0

我从其他地方看到了一个方法
list.sort((data a1, data a2) =>
{
return a1.aa != a2.aa ? a1.aa.compareto(a2.aa) :(这里是冒号)
a1.bb != a2.bb ? a1.bb.compareto(a2.bb) : (这里是冒号)
a1.cc.compareto(a2.cc); (这里是分号)
});
虽然我还不是很懂!

Nicholas_Mophie | 菜鸟二级 |园豆:206 | 2019-05-28 10:32
其他回答(3)
1

1.aa 小于
小于什么?
如果你是要降序排列的话.
那最简单的办法是加权重.就是 aa100000+bb1000+cc 升序排列

吴瑞祥 | 园豆:29449 (高人七级) | 2019-05-27 21:02

1.aa小于 就是 a1.aa < a2.aa 可能我表述不够明确吧

支持(0) 反对(0) Nicholas_Mophie | 园豆:206 (菜鸟二级) | 2019-05-28 10:28

顺便问下 怎么加权重?
我从其他地方学到一个方法
list.sort((data a1, data a2) =>
{
return a1.aa != a2.aa ? a1.aa.compareto(a2.aa) :(这里是冒号)
a1.bb != a2.bb ? a1.bb.compareto(a2.bb) : (这里是冒号)
a1.cc.compareto(a2.cc); (这里是分号)
});

这个已经解决了我的问题 虽然我还不是很懂!

支持(0) 反对(0) Nicholas_Mophie | 园豆:206 (菜鸟二级) | 2019-05-28 10:31

@Nicholas_Mophie: orderby加thenby吧.下面有些了.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2019-05-28 13:50
0

按照你的规则实现一个 IComparer,可以参考这里: https://www.cnblogs.com/luminji/archive/2010/09/30/1839038.html

然后使用这个 IComparer 作为 List.Sort() 的参数进行排序

不如隐茶去 | 园豆:559 (小虾三级) | 2019-05-28 10:26
2

使用 Linq 排序就行了:

list = list.OrderBy(a => a.aa).ThenBy(b => b.bb).ThenBy(c => c.cc).ToList();
三人乐乐 | 园豆:4823 (老鸟四级) | 2019-05-28 13:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册