Подкачайте два объекта в Списке <T>

Есть ли способ LINQ подкачать положение двух объектов внутри a list<T>?

64
задан Tony The Lion 19 January 2010 в 14:46
поделиться

3 ответа

Проверьте ответ от MARC из C #: Хороший / лучший внедрение метода подкачки .

public static void Swap<T>(IList<T> list, int indexA, int indexB)
{
    T tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
}

, который может быть в LinQ-I-Fied, как

public static IList<T> Swap<T>(this IList<T> list, int indexA, int indexB)
{
    T tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
    return list;
}

var lst = new List<int>() { 8, 3, 2, 4 };
lst = lst.Swap(1, 2);
101
ответ дан 24 November 2019 в 15:46
поделиться

Может быть, кто-то будет думать о умном способе сделать это, но вы не должны. Подключение двух элементов в списке по своей природе посадочно-эффект Laden, но операции LINQ должны быть без бокового эффекта. Таким образом, просто используйте простое метод расширения:

static class IListExtensions {
    public static void Swap<T>(
        this IList<T> list,
        int firstIndex,
        int secondIndex
    ) {
        Contract.Requires(list != null);
        Contract.Requires(firstIndex >= 0 && firstIndex < list.Count);
        Contract.Requires(secondIndex >= 0 && secondIndex < list.Count);
        if (firstIndex == secondIndex) {
            return;
        }
        T temp = list[firstIndex];
        list[firstIndex] = list[secondIndex];
        list[secondIndex] = temp;
    }
}
30
ответ дан 24 November 2019 в 15:46
поделиться

Если задание имеет значение, вы должны сохранить свойство на объектах «T» в вашем списке, который обозначает последовательность. Чтобы поменять их, просто поменяйте значение этой собственности, а затем используйте это в .sort ( сравнение с свойством последовательности )

0
ответ дан 24 November 2019 в 15:46
поделиться
Другие вопросы по тегам:

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