列出复杂排序

我有一个大小的List ,比如XS,S,M,L,XL,XXL,UK 10,UK 12等

我想要的是强制订单是上面的,无论列表中的项目顺序如何,我想我需要一个IComparable运算符,但不确定。

理想情况下,我想让另一个List具有正确的顺序,它可以在列表中引用它的’place’并重新排序,如果它不存在则默认为AZ

按照您希望它们的顺序创建一个大小的数组,然后按照它们在该数组中的大小位置对衬衫进行排序:

 string[] sizes = new [] {"XS", "S", "M", "L", "XL", "XXL", "UK 10", "UK 12"}; var shirtsInOrder = shirts .OrderBy(s=>sizes.Contains(s) ? "0" : "1") // put unmatched sizes at the end .ThenBy(s=>Array.IndexOf(sizes,s)) // sort matches by size .ThenBy(s=>s); // sort rest AZ 
 var order = new string[] { "XS", "S", "M", "L", "XL", "XXL", "UK10", "UK12" }; var orderDict = order.Select((c, i) => new { sze = c, ord = i }) .ToDictionary(o => o.sze, o => o.ord); var list = new List { "S", "L", "XL", "L", "L", "XS", "XL" }; var result = list.OrderBy(item => orderDict[item]); 

您可以直接使用OrderByDescending + ThenByDescending

 sizes.OrderByDescending(s => s == "XS") .ThenByDescending( s => s == "S") .ThenByDescending( s => s == "M") .ThenByDescending( s => s == "L") .ThenByDescending( s => s == "XL") .ThenByDescending( s => s == "XXL") .ThenByDescending( s => s == "UK 10") .ThenByDescending( s => s == "UK 12") .ThenBy(s => s); 

我使用...Descending因为true类似于1而false是0。

您还可以创建其他列表,并使用委托与排序一起使用,如果size1的索引> size2的索引则返回。

你也可以这样做:

 public class ShirtComparer : IComparer { private static readonly string[] Order = new[] { "XS", "S", "M", "L", "XL", "XXL", "UK10", "UK12" }; public int Compare(string x, string y) { var xIndex = Array.IndexOf(Order, x); var yIndex = Array.IndexOf(Order, y); if (xIndex == -1 || yIndex == -1) return string.Compare(x, y, StringComparison.Ordinal); return xIndex - yIndex; } } 

用法:

 var list = new List { "S", "L", "XL", "L", "L", "XS", "XL", "XXXL", "XMLS", "XXL", "AM19" }; var result = list.OrderBy(size => size, new ShirtComparer()); 

对于不在列表中的值,它也应该默认为AZ …