首页 > 解决方案 > 在 C# 中序列更新后重新排列通用列表

问题描述

假设我有一个通用列表,例如:

var categories = new List<Category>() {
    new Category() { sequence = 3, categoryName = "Category F" },
    new Category() { sequence = 1, categoryName = "Category S" },
    new Category() { sequence = 2, categoryName = "Category Z" },
    new Category() { sequence = 4, categoryName = "Category X" },
    new Category() { sequence = 5, categoryName = "Category V" }
};

我正在尝试将给定的序列号替换为另一个,即列表中的更新项目,序列号为 2,编号为 5,如下所示:

int currSeq = 2;
int newSeq = 5;
var item = categories.Find(a => a.sequence == currSeq);
item.sequence = newSeq;

如果 newSeq 没有​​重复,例如 newSeq = 6,我可以做 OrderBy:

categories = categories.OrderBy(c => c.sequence).ToList();

但问题是当它们重复时,我需要 newSeq 成为序列#5 并碰撞另一个重复的序列#5 + 1。

请帮助解决此问题的任何指导。谢谢。

更新:某些情况下,当新序列 < 旧序列时,输出不符合预期。

情景一:

var categories = new List<Category>() {
    new Category() { sequence = 3, categoryName = "Category F" },
    new Category() { sequence = 1, categoryName = "Category S" },
    new Category() { sequence = 2, categoryName = "Category Z" },
    new Category() { sequence = 5, categoryName = "Category X" },
    new Category() { sequence = 6, categoryName = "Category V" }
};
int currSeq = 2;
int newSeq = 1;
var result = categories.UpdateSequence(currSeq,newSeq).OrderBy(x=>x.sequence);

输出场景 A:

1: Category S
3: Category Z
4: Category F
5: Category X
6: Category V

所需的输出场景 A:

1: Category Z
2: Category S
3: Category F
5: Category X
6: Category V

场景 B:

int currSeq = 3;
int newSeq = 1;
var result = categories.UpdateSequence(currSeq,newSeq).OrderBy(x=>x.sequence);

输出场景 B:

1: Category Z
2: Category S
4: Category F
5: Category X
6: Category V

期望的输出场景 B:

1: Category F
2: Category S
3: Category Z
5: Category X
6: Category V

标签: c#.netlistlinqsorting

解决方案


做 elgonzo 在他的评论中所说的。另外,从间隔较宽的序列号开始,即 1000、2000、3000 而不是 1、2、3。我不知道您的用例,但除非您重新排序很多,否则这将最大限度地减少您必须做的序列号的“颠簸”数量。


推荐阅读