簡體   English   中英

在c#中進行序列更新后重新排列通用列表

[英]Rearrange generic list after sequence update in 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。

請幫助解決這個問題的任何指導。 謝謝。

更新:某些情況下新序列<舊序列,輸出不符合要求。

情景A:

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

做elgonzo在評論中說的話。 另外,從寬間隔的序列號開始,即1000,2000,3000而不是1,2,3。 我不知道你的用例,但除非你重新排序,否則這將減少你必須做的序列號的“顛簸”次數。

假設您已經基於Sequence對列表進行了Sequence ,可以使用LINQ的FindIndex方法通過currSeqnewSeq查找元素的索引,然后使用RemoveAtInsert將更新的元素放在正確的位置。

像這樣的東西:

int currSeq = 2;
int newSeq = 5;
var oldIndex = categories.FindIndex(i => i.Sequence == currSeq);
var newIndex = categories.FindIndex(i => i.Sequence == newSeq);

if(oldIndex > -1)
{
    var oldItem = lst[oldIndex];
    oldItem.ID = newSeq;

    if(newIndex > -1)
    {
        newIndex = newIndex-1 < 0 ? 0 : newIndex - 1;    //in case the first element is the existing one
        categories.RemoveAt(oldIndex);
        categories.Insert(newIndex, oldItem);
    }
    else
    {
        categories = lst.OrderBy(i => i.ID).ToList();
    }
}

我認為這將解決您的問題。 但是當插入所有后續行時也會移動。 這對你好嗎?

    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" }
    };

    List<string> list = new List<string>();
    for (int i = 0; i < 6; i++)
    {
        list.Add("");
    }

    foreach (var item in categories)
    {
        list[item.sequence] = item.categoryName;
    }

    var removeFrom = 2;
    var removeTo = 5;

    list.Insert(removeTo, list[removeFrom]);
    list.RemoveAt(removeFrom);

根據評論更新並編輯OP。

假設您的Category類定義如下。

public class Category
{
    public int sequence{get;set;}
    public string categoryName{get;set;}
}

您可以按如下方式編寫Update Sequence方法,以便在newValue <oldValue時獲得所需的結果。

 public static List<Category> UpdateSequence(this List<Category> categories, int oldValue,int newValue)
 {
        var invalidState = -1;
        if(oldValue>newValue)
        {
            categories.Single(x=>x.sequence == oldValue).sequence = invalidState;
            if(categories.Any(x=>x.sequence == newValue))
            {
                categories = UpdateSequence(categories, newValue,newValue+1);
            }
            categories.Single(x=>x.sequence == invalidState).sequence = newValue;
        }
        else
        {
            if(categories.Any(x=>x.sequence == newValue))
            {
                categories = UpdateSequence(categories, newValue,newValue+1);
            }
            categories.Single(x=>x.sequence==oldValue).sequence = newValue;
        }
        return categories;
    }

輸入

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" }

場景1:

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

產量

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

情景2

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

輸出繼電器

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM