C# 重新排列列表<;T>;使用lambda
我需要重新排列项目列表,以便选定的项目位于列表的末尾,最后一个项目替换前一个项目,前一个项目替换前一个项目,依此类推 例如,如果我有一个包含10个项目的列表,并且所选项目位于位置5,则该项目将转到位置9,9将替换8,然后8替换7,7替换6,6将占据位置5。我使用以下代码成功地获得了所需的结果: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
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
我确信我的代码是丑陋和低效的:我有两个问题:
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;