如何对多个不同类型对象的Age属性统一排序并实现通用方法
方案1:定义公共接口(推荐,类型安全,扩展性强)
这种方案适合后续需要保留原对象实例、或者需要扩展更多公共属性的场景,只要新增类型实现统一接口即可,无需修改排序逻辑。
首先定义包含Age属性的公共接口:
public interface IHasAge { int Age { get; } }
修改原有类实现该接口:
public class Person : IHasAge { public int Age { get; set; } // 原有其他属性、方法保留不变 } public class Dog : IHasAge { public int Age { get; set; } // 原有其他属性、方法保留不变 } // 后续新增Cat、Bird等类型,只要实现IHasAge接口即可
合并所有对象后统一排序提取Age:
List<Person> personList = new List<Person> { new Person { Age = 77 }, new Person { Age = 88 }, new Person { Age = 1001 }, new Person { Age = 755 } }; List<Dog> dogList = new List<Dog> { new Dog { Age = 1 }, new Dog { Age = 9 }, new Dog { Age = 10 }, new Dog { Age = 8 } }; // 合并所有实现了IHasAge的对象列表 List<IHasAge> allAgeObjects = new List<IHasAge>(); allAgeObjects.AddRange(personList); allAgeObjects.AddRange(dogList); // 后续新增其他类型列表,直接AddRange对应列表即可,无需修改排序逻辑 // 排序并提取Age var sortedAges = allAgeObjects.OrderBy(obj => obj.Age).Select(obj => obj.Age); // 输出结果:1 8 9 10 77 88 755 1001 Console.WriteLine(string.Join(" ", sortedAges));
方案2:直接提取Age值合并排序(无需修改原有类)
如果不需要保留原对象实例,也不想修改原有类的定义,可以直接提取所有列表的Age值合并后排序,代码更轻便:
List<int> allAges = new List<int>(); // 逐个提取各列表的Age属性 allAges.AddRange(personList.Select(p => p.Age)); allAges.AddRange(dogList.Select(d => d.Age)); // 后续新增其他类型列表,仅需加一行AddRange提取Age即可 allAges.Sort(); // 输出结果:1 8 9 10 77 88 755 1001 Console.WriteLine(string.Join(" ", allAges));
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

