通过两个字段对字典进行排序的最快方法,一个按字母排序,另一个是自定义字段?

Met*_*uru 2 c# sorting list

假设我有一个List<Pet>,每个宠物都有一个Pet.Name和一个Pet.Type领域.

例如:

名称:鲍勃类型:鱼

名称:雷克斯类型:狗

姓名:Alf类型:狗

名称:蓬松型:猫

名称:阿波罗类型:鱼

名称:芒果类型:马

现在我想按字母顺序排序名称,然后按类型排序(非阿尔法).

第二种排序(类型)不是按字母顺序排列的,而只是特定的/自定义的.

例如,假设订单应始终为:Fish,Horses,Dogs,Cats.

因此,上述数据中正确排序的列表如下所示:

阿波罗,鱼

阿尔夫,狗

鲍勃,鱼

蓬松,猫

芒果,马

雷克斯,狗

或者更清楚:

一条鱼

一匹马

一只狗

一只猫

B,鱼

B,马

B,狗

B,猫

C,鱼

C,马

C,狗

C,猫

这意味着有时Cat会出现在Dog之前,但只有当猫有一个'A'这个名字但没有带有'A'名字的狗时......才能得到它?

所以它按字母顺序排序,但随后在每个字母组中,它以基于第二个字段的自定义方式排序.

那么以这种方式对这个List进行排序的最快方法是什么?

Ani*_*Ani 5

怎么样:

string[] orderedTypes = { "Fish", "Horses", "Dogs", "Cats" };

var orderedPets = sourcePets.OrderBy(pet => pet.Name)
                            .ThenBy(pet => Array.IndexOf(orderedTypes, pet.Type));
Run Code Online (Sandbox Code Playgroud)

现在它没有那么高效,因为它需要orderedTypes多次线性搜索字符串数组来执行二级排序,但只有4种宠物,这应该不会太糟糕.

如果你真的很担心(虽然还有几种宠物类型),你可以先创建一个查找:

var orderByType = new[] { "Fish", "Horses", "Dogs", "Cats" }
                  .Select(Tuple.Create<string, int>)
                  .ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2);

var orderedPets = sourcePets.OrderBy(pet => pet.Name)
                            .ThenBy(pet => orderByType[pet.Type]);
Run Code Online (Sandbox Code Playgroud)

如果你有这样的枚举而不是字符串:

 public enum AnimalType
 {
     Fish, Horses, Dogs, Cats
 }
Run Code Online (Sandbox Code Playgroud)

那么操作就像下面这样简单:

var orderedPets = sourcePets.OrderBy(pet => pet.Name)
                            .ThenBy(pet => pet.Type);
Run Code Online (Sandbox Code Playgroud)