加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用lambda重新排列List

发布时间:2020-12-15 08:26:02 所属栏目:百科 来源:网络整理
导读:我需要重新排列项目列表,以便所选项目到达列表的末尾,最后一项替换前一项目,前一项目替换之前的项目,依此类推. 例如,如果我有一个包含十个项目的列表,并且所选项目位于第5位,则此项目将转到位置9,而9将替换为8然后8替换7和7替换6和6取代位置5.我设法获得了使
我需要重新排列项目列表,以便所选项目到达列表的末尾,最后一项替换前一项目,前一项目替换之前的项目,依此类推.

例如,如果我有一个包含十个项目的列表,并且所选项目位于第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);

结果是:

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

我确定我的代码很丑陋且效率低下:我有两个问题:

>是否可以使用Lambda获得相同的结果?如果不是,那么
>如何优化我的代码.谢谢.

解决方法

您可以使用 Remove Method删除所选项目,使用 Add Method将其附加到最后:
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);

之前:

0 2 4 6 8 10 12 14 16 18

删除后(6):

0 2 4 8 10 12 14 16 18

添加(6)后:

0 2 4 8 10 12 14 16 18 6

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

List<int> numList = new List<int>();
for (int i = 0; i < 10; i++) numList.Add(2 * i);

int selectedIndex = 5; // selected at runtime
int selectedNum = numList[selectedIndex];
numList.RemoveAt(selectedIndex);
numList.Add(selectedNum);

之前:

0 2 4 6 8 10 12 14 16 18

在RemoveAt(5)之后:

0 2 4 6 8 12 14 16 18

添加(10)后:

0 2 4 6 8 12 14 16 18 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();

numList:

0 2 4 6 8 10 12 14 16 18

newNumList:

0 2 4 6 8 12 14 16 18 10

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读