假设我有一个List<Pet>,每个宠物都有一个Pet.Name和一个Pet.Type领域.
例如:
名称:鲍勃类型:鱼
名称:雷克斯类型:狗
姓名:Alf类型:狗
名称:蓬松型:猫
名称:阿波罗类型:鱼
名称:芒果类型:马
现在我想按字母顺序排序名称,然后按类型排序(非阿尔法).
第二种排序(类型)不是按字母顺序排列的,而只是特定的/自定义的.
例如,假设订单应始终为:Fish,Horses,Dogs,Cats.
因此,上述数据中正确排序的列表如下所示:
阿波罗,鱼
阿尔夫,狗
鲍勃,鱼
蓬松,猫
芒果,马
雷克斯,狗
或者更清楚:
一条鱼
一匹马
一只狗
一只猫
B,鱼
B,马
B,狗
B,猫
C,鱼
C,马
C,狗
C,猫
这意味着有时Cat会出现在Dog之前,但只有当猫有一个'A'这个名字但没有带有'A'名字的狗时......才能得到它?
所以它按字母顺序排序,但随后在每个字母组中,它以基于第二个字段的自定义方式排序.
那么以这种方式对这个List进行排序的最快方法是什么?
怎么样:
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)