Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# - Fatal编程技术网

C# 按自定义顺序对列表排序

C# 按自定义顺序对列表排序,c#,C#,我有一些类型的数组 private string[] linkTypes = { "dog", "cat", // and so on .. }; 是的,我可以使用枚举,但在这种情况下,它必须是 字符串 现在我有了一个名为“LinkElement”的对象列表 如果链接类型包含元素“dog”和“cat”,则我的链接类型只能是“dog”或“cat”。 我想按链接类型的顺序对列表“链接”进行排序 表示列表顺序包含先有“dog”类型的链接,然后出现“cat”类型的链接 List

我有一些类型的数组

private string[] linkTypes = {
    "dog",
    "cat",
    // and so on ..
};
是的,我可以使用
枚举
,但在这种情况下,它必须是 字符串

现在我有了一个名为“LinkElement”的对象列表

如果链接类型包含元素“dog”和“cat”,则我的链接类型只能是“dog”或“cat”。

我想按链接类型的顺序对列表“链接”进行排序

表示列表顺序包含先有“dog”类型的链接,然后出现“cat”类型的链接

List sortedLinks=;//排序链接
for(int i=0;i
有人能帮我吗?

诸如“字母顺序”(字符串)、“较大的数字”(数字类型)等比较都是使用IComparable接口完成的。您可以在自定义类中实现此接口,使实例按自己喜欢的方式进行排序。请阅读此处的界面:


如果有固定数量的类型,则可以使用快速帮助器方法根据每个对象的类型为其返回一个整数,并比较每个对象返回的整数以确定哪一个“先到”。

假设
linkTypes
(私有字符串数组)与
links
在同一类中(在
LinkElement
的列表中),您可以将LINQ的OrderBy与一个简单的lambda表达式一起使用:

var sortedLinks = links.OrderBy(le => Array.IndexOf(linkTypes, le.linkType)).ToList()

实现
IComparer
IComparable
接口。使用
IComparable
的缺点是,这必须由排序的目标类实现,这意味着如果您想在代码的其他地方以不同的方式对其排序,您将无法使用此mec另一方面,
IComparer
可以与目标类解耦,如果您选择,可以通过多种方式实现,并且根据应用程序不同部分的排序标准,您可以根据需要应用其中一个
IComparer


是的,这很好,但是这里缺少一个参数
IndexOf(le.linkType))
对不起,代码是直接在这里编写的,没有经过测试。现在修好了。总的来说这是一个好主意,但在这种情况下可能是杀伤力太大了。我以前写过很多,但因为我们有LINQ的OrderBy,我甚至不记得写过一个比较器。诚然,使用LINQ可能比其他方法慢一点,但是除非您有真正的性能问题,并且能够确定原因是使用OrderBy,否则谁会在乎呢?
string linkType = links[index].Type;
List<LinkElement> sortedLinks = ; // sort links

for (int i = 0; i < sortedLinks.Count; i++)
{
    LinkElement currentLink = sortedLinks[i];
    Console.WriteLine(currentLink.Type);
}

// Write down dogs first, cats after
var sortedLinks = links.OrderBy(le => Array.IndexOf(linkTypes, le.linkType)).ToList()