如何在C#中依据另一个列表的SequenceId对列表排序?
解决方案
先把sequenceList转换成字典,用来快速定位每个SequenceId对应的排序优先级:
// 构建SequenceId到排序索引的映射 var sequenceOrderMap = sequenceList .Select((item, index) => new { item.SequenceId, Index = index }) .ToDictionary(x => x.SequenceId, x => x.Index);
接着对secondList做排序:匹配sequenceList的元素按字典里的索引顺序排,不匹配的直接放到后面。如果需要给后面的元素再加排序规则(比如按SequenceId升序),可以追加ThenBy:
var sortedSecondList = secondList .OrderBy(item => sequenceOrderMap.TryGetValue(item.SequenceId, out var index) ? index : int.MaxValue) // 可选:给不匹配的元素加额外排序规则,比如按SequenceId排序 .ThenBy(item => item.SequenceId) .ToList();
完整代码示例
// 获取sequenceList var sequenceList = await context.SequenceDB .Where(c => c.PeopleId == peopleId) .Select(c => new { SequenceId = c.SequenceId, Relevant = c.Relevant }) .OrderBy(c => c.Relevant) .ToListAsync(); // 获取secondList var secondList = await context.Activity.ToListAsync(); // 构建顺序映射字典 var sequenceOrderMap = sequenceList .Select((seq, idx) => new { seq.SequenceId, Order = idx }) .ToDictionary(x => x.SequenceId, x => x.Order); // 执行排序 var sortedList = secondList .OrderBy(item => sequenceOrderMap.ContainsKey(item.SequenceId) ? sequenceOrderMap[item.SequenceId] : int.MaxValue) // 可根据需求调整后续排序规则,比如按创建时间排序 .ThenBy(item => item.SequenceId) .ToList();
说明
- 用字典做映射是为了让查找操作更快,避免每次排序都遍历
sequenceList - 用
int.MaxValue确保不匹配的元素全排在匹配元素后面 - 后面的
ThenBy可以根据实际需求修改,比如换成按活动创建时间、名称等属性排序
内容的提问来源于stack exchange,提问作者devludo
相关产品推荐
相关产品推荐

