如何按不同的值对字符串进行排序

cjk*_*k84 1 c# sorting

我已经尝试寻找一个现有的问题,但不知道该怎么说这个,这检​​索没有任何结果:(

无论如何,我有一类具有不同属性的"订单项".这些订单商品用于服装,因此它们的尺寸(字符串).

因为我是关于这些事情的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"(又称中等)的大小,它将按照我不想要的顺序出现在某个地方,假设程序没有崩溃和烧毁.

我无法完全理解如何做到这一点.

Tim*_*ter 5

您可以直接使用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.

  • 这会产生很多开销. (3认同)

Kaf*_*Kaf 5

此外,您可以创建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)