我已经尝试寻找一个现有的问题,但不知道该怎么说这个,这检索没有任何结果:(
无论如何,我有一类具有不同属性的"订单项".这些订单商品用于服装,因此它们的尺寸(字符串).
因为我是关于这些事情的OCD,所以我希望元素不是按字母数字值排序,而是按自定义顺序排列.
如果可能的话,我也不希望这个自定义订单硬编码.
要分解,如果我有一个这些订单项的列表,每个订单项的大小,如下:
2XL
S
5XL
M
Run Code Online (Sandbox Code Playgroud)
使用字母数字排序,它将按以下顺序排列:
2XL
5XL
M
S
Run Code Online (Sandbox Code Playgroud)
但我想将此列表排序为此顺序(从最小的大小到最大的):
S
M
2XL
5XL
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是使用硬编码的大小数组并按索引排序,然后当我需要获取大小值时,我可以获取大小顺序array [i]值.但是,正如我所说,我更希望这个命令不被硬编码.
我希望订单是动态的原因是订单项在运行时从硬盘上的文件加载,并且还在运行时由用户添加/编辑/删除,它们可能包含我没有的大小硬编码,例如我可以硬编码从10XS到10XL,但如果有人添加"110cm"(又称中等)的大小,它将按照我不想要的顺序出现在某个地方,假设程序没有崩溃和烧毁.
我无法完全理解如何做到这一点.
您可以直接使用OrderByDescending+ ThenByDescending:
sizes.OrderByDescending(s => s == "S")
.ThenByDescending( s => s == "M")
.ThenByDescending( s => s == "2XL")
.ThenByDescending( s => s == "5XL")
.ThenBy(s => s);
Run Code Online (Sandbox Code Playgroud)
我使用,...Descending因为a true类似于1而a false是0.
此外,您可以创建Dictionary<int, string>并添加Key 为 Ordering order以下.在Keys之间留出一些空白,以适应未来的新尺寸.例如:如果要添加L (Large),可以添加新项目而{15, "L"}不会破坏当前订单.
Dictionary<int, string> mySizes = new Dictionary<int, string> {
{ 20, "2XL" }, { 1, "S" },
{ 30, "5XL" }, { 10, "M" }
};
var sizes = mySizes.OrderBy(s => s.Key)
.Select(s => new {Size = s.Value})
.ToList();
Run Code Online (Sandbox Code Playgroud)