C# 重新排列列表<;T>;使用lambda

C# 重新排列列表<;T>;使用lambda,c#,list,lambda,C#,List,Lambda,我需要重新排列项目列表,以便选定的项目位于列表的末尾,最后一个项目替换前一个项目,前一个项目替换前一个项目,依此类推 例如,如果我有一个包含10个项目的列表,并且所选项目位于位置5,则该项目将转到位置9,9将替换8,然后8替换7,7替换6,6将占据位置5。我使用以下代码成功地获得了所需的结果: List<int> numList = new List<int>(); int selectedNum = 5;//Selected at runtime for (int i

我需要重新排列项目列表,以便选定的项目位于列表的末尾,最后一个项目替换前一个项目,前一个项目替换前一个项目,依此类推

例如,如果我有一个包含10个项目的列表,并且所选项目位于位置5,则该项目将转到位置9,9将替换8,然后8替换7,7替换6,6将占据位置5。我使用以下代码成功地获得了所需的结果:

List<int> numList = new List<int>();
int selectedNum = 5;//Selected at runtime
for (int i = 0; i < 10; i++) numList.Add(i);
int numListCount = numList.Count-1;
int tempNum = numList[numListCount];
List<int> tempList = numList.GetRange(selectedNum + 1,(numList.Count-selectedNum) - 2);
numList[numListCount] = selectedNum;
numList.RemoveRange(selectedNum, (numList.Count-selectedNum)-1);
numList.InsertRange(selectedNum, tempList);
numList.Insert(numListCount - 1, tempNum);
List numList=new List();
int selectedNum=5//在运行时选择
对于(inti=0;i<10;i++)numList.Add(i);
int numList Count=numList.Count-1;
int tempNum=numList[numListCount];
List templast=numList.GetRange(selectedNum+1,(numList.Count selectedNum)-2);
numList[numListCount]=selectedNum;
numList.RemoveRange(selectedNum,(numList.Count selectedNum)-1);
numList.InsertRange(selectedNum,templast);
Insert(numListCount-1,tempNum);
结果是:

0,1,2,3,4,6,7,8,9,5

我确信我的代码是丑陋和低效的:我有两个问题:

  • 使用Lambda是否可能得到相同的结果?如果不可能,则
  • 我如何改进我的代码。谢谢
  • 您可以使用删除所选项目,并在末尾附加该项目:

    List<int> numList = new List<int>();
    for (int i = 0; i < 10; i++) numList.Add(2 * i);
    
    int selectedNum = 6; // selected at runtime
    numList.Remove(selectedNum);
    numList.Add(selectedNum);
    
    移除(6)后:

    在添加(6)之后:


    如果要在选定索引处移动项目,可以使用,而不是:

    移除后(5):

    在添加(10)之后:


    使用LINQ,您将创建一个新的列表,其中已删除并附加选定项。不过,如上所示的就地更新效率要高得多

    List<int> numList = new List<int>();
    for (int i = 0; i < 10; i++) numList.Add(2 * i);
    
    int selectedIndex = 5; // selected at runtime
    List<int> newNumList = numList.Take(selectedIndex)
                                  .Concat(numList.Skip(selectedIndex + 1))
                                  .Concat(numList.Skip(selectedIndex).Take(1))
                                  .ToList();
    
    纽姆利斯特:


    据我所知,你只是想把一个给定的项目移到列表的底部,对吗

    List<int> list = new List<int>();
    for (int i = 0; i < 10; i++) 
        numList.Add(i);
    int temp = list[5];
    list.RemoveAt(5);
    list.Add(temp);
    
    List List=新列表();
    对于(int i=0;i<10;i++)
    numList.添加(i);
    int temp=列表[5];
    列表。删除(5);
    列表。添加(临时);
    

    编辑:我的理解是你知道你想要移动的物品的位置(5)。如果你知道这个值,那么发布的另一个答案就是正确的

    你不需要所有额外的东西,包括临时列表。你可以这么做

    numList.Remove(selectedNum);
    numList.Add(selectedNum);
    

    就这么简单。

    现在无法检查它,但这应该可以做到:

    var temp = list.Take(index-1).Concat(list.Skip(index)).Concat(list[index]);
    list = temp;
    
    0 2 4 6 8 10 12 14 16 18
    
    0 2 4 6 8 12 14 16 18
    
    0 2 4 6 8 12 14 16 18 10
    
    List<int> numList = new List<int>();
    for (int i = 0; i < 10; i++) numList.Add(2 * i);
    
    int selectedIndex = 5; // selected at runtime
    List<int> newNumList = numList.Take(selectedIndex)
                                  .Concat(numList.Skip(selectedIndex + 1))
                                  .Concat(numList.Skip(selectedIndex).Take(1))
                                  .ToList();
    
    0 2 4 6 8 10 12 14 16 18
    
    0 2 4 6 8 12 14 16 18 10
    
    List<int> list = new List<int>();
    for (int i = 0; i < 10; i++) 
        numList.Add(i);
    int temp = list[5];
    list.RemoveAt(5);
    list.Add(temp);
    
    numList.Remove(selectedNum);
    numList.Add(selectedNum);
    
    var temp = list.Take(index-1).Concat(list.Skip(index)).Concat(list[index]);
    list = temp;