Перегруппировка списка <T>с использованием лямбды - PullRequest
6 голосов
/ 08 сентября 2011

Мне нужно изменить список элементов так, чтобы выбранный элемент переместился в конец списка, а последний элемент заменил предыдущий, а предыдущий элемент заменил предыдущий, и так далее.

Например, если у меня есть список из десяти предметов, и выбранный предмет находится в позиции 5, этот предмет переходит в позицию 9 и 9 заменяет 8, затем 8 заменяет 7 и 7 заменяет 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

Я уверен, что мой код уродлив и неэффективен: у меня два вопроса:

  1. Можно ли получить тот же результат, используя Lambda?Если нет, то
  2. Как я могу уточнить свой код.Спасибо.

Ответы [ 4 ]

8 голосов
/ 08 сентября 2011

Вы можете использовать Метод удаления , чтобы удалить выбранный элемент, и Добавить метод , чтобы добавить его в конце:

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
1 голос
/ 08 сентября 2011

Вам не нужны все эти дополнительные вещи, включая временный список.Вы можете просто сделать

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

Просто так.

1 голос
/ 08 сентября 2011

Насколько я понимаю, вы просто хотите переместить данный элемент в конец списка справа?

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);

РЕДАКТИРОВАТЬ: я понимаю, что вы знали положение элемента, который вы хотите переместить (5).Если вы знаете значение, тогда другой опубликованный ответ является правильным для этого

0 голосов
/ 08 сентября 2011

Не могу проверить это сейчас, но это должно сработать:

var temp = list.Take(index-1).Concat(list.Skip(index)).Concat(list[index]);
list = temp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...