C# Linq如何实现两个不同类型列表按指定规则合并排序
实现方案
两个不同类型的列表无法直接合并,首先需要将两类数据统一投影到相同结构,再按要求排序即可,下面提供两种适配不同场景的实现:
方案1:匿名类型实现(无侵入,无需修改原类定义)
如果只需要读取合并后的结果,不需要保留原始类的类型信息,直接用匿名类型投影即可:
var mergedResult = listDataA // 将DataA投影为包含三个目标属性的匿名类型 .Select(a => new { a.Data, a.Order, a.CreatedOn }) // 合并投影后的DataB列表 .Concat(listDataB.Select(b => new { b.Data, b.Order, b.CreatedOn })) // 先按Order升序排序 .OrderBy(item => item.Order) // Order相同时按CreatedOn升序排序 .ThenBy(item => item.CreatedOn) .ToList();
方案2:公共接口实现(保留原始类型信息)
如果需要后续操作原始类型的对象,可以先定义公共接口让两个类实现,再合并排序:
- 定义公共接口并修改类实现:
public interface IData { string Data { get; } int Order { get; } DateTime CreatedOn { get; } } public class DataA : IData { public string Data { get; set; } public int Order { get; set; } public DateTime CreatedOn { get; set; } } public class DataB : IData { public string Data { get; set; } public int Order { get; set; } public DateTime CreatedOn { get; set; } }
- 执行合并排序:
var mergedResult = listDataA.Cast<IData>() .Concat(listDataB.Cast<IData>()) .OrderBy(item => item.Order) .ThenBy(item => item.CreatedOn) .ToList();
两种方案最终输出的结果都和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者John Sari
相关产品推荐
相关产品推荐

