Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;字符串>;复杂排序_C#_Linq_Sorting_Lambda_Arraylist - Fatal编程技术网

C# 列表<;字符串>;复杂排序

C# 列表<;字符串>;复杂排序,c#,linq,sorting,lambda,arraylist,C#,Linq,Sorting,Lambda,Arraylist,我有一个大小的列表,比如XS、S、M、L、XL、XXL、UK 10、UK 12等 我想要的是强制顺序为上面的顺序,不管列表中项目的顺序如何,我想我需要一个IComparable操作符,但不确定 理想情况下,我希望有另一个具有正确顺序的列表,它可以引用列表中的“位置”并重新排序,如果它不存在,它将默认为A-Z您可以直接使用OrderByDescending+然后使用bydescending: sizes.OrderByDescending(s => s == "XS") .Then

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

我想要的是强制顺序为上面的顺序,不管列表中项目的顺序如何,我想我需要一个IComparable操作符,但不确定


理想情况下,我希望有另一个具有正确顺序的列表,它可以引用列表中的“位置”并重新排序,如果它不存在,它将默认为A-Z

您可以直接使用
OrderByDescending
+
然后使用bydescending

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);
我使用降序,因为
true
类似于1,而
false
是0。

var顺序=新字符串[]{“XS”、“S”、“M”、“L”、“XL”、“XXL”、“UK10”、“UK12”};
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<string> { "S", "L", "XL", "L", "L", "XS", "XL" };
var result = list.OrderBy(item => orderDict[item]);
var ordedict=order.Select((c,i)=>new{sze=c,ord=i}) .ToDictionary(o=>o.sze,o=>o.ord); var list=新列表{“S”、“L”、“XL”、“L”、“L”、“XS”、“XL”}; var result=list.OrderBy(item=>orderDict[item]);
按照您希望的大小顺序创建一个大小数组,然后根据大小在该数组中的位置对衬衫进行排序:

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 A-Z

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

您也可以这样做:

public class ShirtComparer : IComparer<string>
{
    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;
    }
}
公共类衬衫比较者:IComparer
{
私有静态只读字符串[]顺序=新[]{“XS”、“S”、“M”、“L”、“XL”、“XXL”、“UK10”、“UK12”};
公共整数比较(字符串x、字符串y)
{
var xIndex=Array.IndexOf(顺序,x);
var yIndex=Array.IndexOf(顺序,y);
if(xIndex==-1 | yIndex==-1)
返回string.Compare(x,y,StringComparison.Ordinal);
返回xIndex-yIndex;
}
}
用法:

var list = new List<string> { "S", "L", "XL", "L", "L", "XS", "XL", "XXXL", "XMLS", "XXL", "AM19" };
var result = list.OrderBy(size => size, new ShirtComparer());
var list=新列表{“S”、“L”、“XL”、“L”、“L”、“XS”、“XL”、“XXXL”、“XMLS”、“XXL”、“AM19”};
var result=list.OrderBy(size=>size,new ShirtComparer());

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

@Tigran My guess?他想用一个定制的
IComparer
对资料进行分类。第二部分呢?一个<代码> SortedDictionary <代码>可能会起作用。@ TiGRAN基本上有一个列表,包含:XXXL,S,M,L,我需要它们来命令我如何状态(也许在另一个列表中按正确的顺序),这样的结果是:S,M,L,XXXLL,你可能想考虑创建一个枚举并转换这些值。在数组上执行线性搜索。我缺少“如果它不存在,它将默认为a-Z”谢谢,第二行如何与第一行一起工作?也不确定s.Size是从哪里来的?我提供了一个示例,假设您有一个衬衫类,它有一个Size属性-它可能不适合您的特定用途,只是一个示例。啊,是的,我明白了。不,目前我只有一个列表而不是一个类,可能需要在我的代码中转换它,除非有一个简单的解决方案?类似地,当我想对
uint
s列表排序时,我会
var sorted=myUints.OrderByDescending(mu=>mu==0);对于(uint u=1;u<1000;u++)排序=排序。然后按降序(s=>s==u);排序=排序。然后按(s=>s)谢谢Tim,它订购的是s、M、L等,但不是UK 6、UK 8等,可能是因为这些号码吗?@dhardy:你想如何订购这些英国号码?我以为只有两个(UK10和UK12)。这是我需要的顺序:“15”,“15.5”,“16”,“16,5”,“17”,“17.5”,“18”,“18.5”,“19”,“UK6”,“UK8”,“UK10”,“UK12”,“UK14”,“UK16”,“XS”,“S”,“M”,“L”,“XL”,“XXL”谢谢,Daveher还有,我没有“如果它不存在,它将默认为A-Z”谢谢,如果字典中不存在该值,则会发生错误,如果不存在,则需要按a-z排序。。