Есть ли способ LINQ подкачать положение двух объектов внутри a list<T>
?
Проверьте ответ от 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);
Может быть, кто-то будет думать о умном способе сделать это, но вы не должны. Подключение двух элементов в списке по своей природе посадочно-эффект 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;
}
}
Если задание имеет значение, вы должны сохранить свойство на объектах «T» в вашем списке, который обозначает последовательность. Чтобы поменять их, просто поменяйте значение этой собственности, а затем используйте это в .sort ( сравнение с свойством последовательности )