Вопрос по c#, linq – Поменяйте местами элементы списка <> с помощью c # с помощью LINQ

8

У меня есть этот список

var list = new List {3, 1, 0, 5};

Я хочу поменять элемент 0 на 2

output 0, 1, 3, 5

Возможный дубликатSwap two items in List<T> QuarK

Ваш Ответ

3   ответа
2

Классический своп это ...


int temp = list[0];
list[0] = list[2];
list[2] = temp;

Я не думаю, что у Linq есть какой-либо "обмен" функциональность, если это то, что вы ищете.

16

Если вы просто хотите, чтобы это было отсортировано, я бы использовал List.Sort ().

Если вы хотите поменяться, нет встроенного метода для этого. Было бы легко написать метод расширения, хотя:

static void Swap<T>(this List<T> list, int index1, int index2)
{
     T temp = list[index1];
     list[index1] = list[index2];
     list[index2] = temp;
}

Вы могли бы тогда сделать:

list.Swap(0,2);
Ты ударил меня! Я все равно вернул бы IEnumerable.
Вы можете получить доступ к IEnumerable по индексу, используя Enumerable.ElementAt.
@ReedCopsey, вы должны сделать это расширение IList, тогда оно работает и для ObservableCollection и для лайков.
@ Джо Чунг: Но это действительно не так. использование IEnumerable - это потоковая передача по перечисляемому, чтобы получить элемент в местоположении, что ужасно неэффективно.
Вы не можете получить доступ к IEnumerable по индексу, поэтому ваш метод не будет работать. Вы могли бы возвратить IEnumerable, но это было бы потенциально неожиданным поведением, если бы вы не создали копию, поскольку вы возвращаете измененную коллекцию. Создание копии добавило бы накладные расходы.
1

В случае, если что-то не поддерживается напрямую ... сделайте так, номер 1!

Взгляните на концепцию& quot; методы расширени & quot;, Благодаря этому вы можете легко сделать свой список поддерживающим концепцию Swap () (это применимо в любое время, когда вы хотите расширить функциональность класса).

    namespace ExtensionMethods
    {
        //static class
        public static class MyExtensions 
        {
            //static method with the first parameter being the object you are extending 
            //the return type being the type you are extending
            public static List<int> Swap(this List<int> list, 
                int firstIndex, 
                int secondIndex) 

            {
                int temp = list[firstIndex];
                list[firstIndex] = list[secondIndex];
                list[secondIndex] = temp;

                return list;
            }
        }   
    }

Похожие вопросы