如何将已排序列表按交错顺序排列?
如何将已排序列表按交错顺序排列?
看起来你现在的代码是把每个元素的所有Amount实例一次性输出完,而不是按优先级交错着输出对吧?我来帮你调整一下逻辑~
首先,你的列表已经按Priority排好序了,现在要做的是循环遍历这个排序后的列表,每次从每个元素里取一个输出,直到所有元素的Amount都变成0。
这里有个更清晰的实现思路:
- 先保留排序后的列表(注意最好不要修改原列表的
Amount,可以创建一个副本,避免影响原数据) - 循环检查是否还有元素的
Amount大于0 - 每次循环遍历排序后的列表,只要当前元素的
Amount>0,就输出它的Name,然后把Amount减1
下面是修改后的代码:
public static void Main() { List<ColumnArrangment> listVersion = new List<ColumnArrangment>(); listVersion.Add(new ColumnArrangment { Name ="Questions", Priority = 2, Amount = 2}); listVersion.Add(new ColumnArrangment { Name ="Parts", Priority = 1, Amount = 2}); listVersion.Add(new ColumnArrangment { Name ="CodeLetters", Priority = 4, Amount = 2}); listVersion.Add(new ColumnArrangment { Name ="Answers", Priority = 3, Amount = 2}); // 先按Priority排序,并且创建副本避免修改原数据 List<ColumnArrangment> sortedList = listVersion .OrderBy(o => o.Priority) .Select(ca => new ColumnArrangment(ca)) // 使用拷贝构造函数创建副本 .ToList(); // 循环直到所有元素的Amount都为0 while (sortedList.Any(ca => ca.Amount > 0)) { foreach (var item in sortedList) { if (item.Amount > 0) { Console.WriteLine(item.Name); item.Amount--; } } } } public class ColumnArrangment { public string Name { get; set; } public int Priority { get; set; } public int Amount { get; set; } public ColumnArrangment() { } public ColumnArrangment(ColumnArrangment ca) { Name = ca.Name; Priority = ca.Priority; Amount = ca.Amount; } }
这段代码运行后,输出就是你想要的交错顺序:
Parts
Questions
Answers
CodeLetters
Parts
Questions
Answers
CodeLetters
为什么要创建副本呢?因为如果直接修改原列表的Amount,后续如果还要用到原数据就会有问题,用你已经写好的拷贝构造函数刚好可以快速创建独立的副本~
另外,之前你的代码里在foreach里又调用SortedList.FindIndex和ElementAt,其实没必要,因为foreach已经在遍历每个元素了,直接操作当前元素就可以,不过核心问题还是输出顺序的逻辑不对,现在改成外层循环检查是否还有剩余元素,内层遍历排序后的列表逐个输出,就能实现交错效果啦。
备注:内容来源于stack exchange,提问作者CJP
相关产品推荐
相关产品推荐

