Список подкачки <> элементы с c# с помощью LINQ

НОВЫЙ ОТВЕТ :

В моем исходном ответе (ниже), у меня должно было быть два различных макросов для поддержки утверждений в функциональном объеме и в глобальной области видимости. Я задался вопросом, было ли возможно предложить единое решение, которое работало бы в обоих объемах.

я смог найти решение, которое работало на компиляторы Visual Studio и Comeau с помощью символьных массивов экстерна. Но я смог найти более сложное решение, которое работает на GCC. Но решение GCC не работает на Visual Studio.: (Но добавление '#ifdef __ GNUC __ ', легко выбрать правильный набор макросов для данного компилятора.

Решение:

#ifdef __GNUC__
#define STATIC_ASSERT_HELPER(expr, msg) \
    (!!sizeof \ (struct { unsigned int STATIC_ASSERTION__##msg: (expr) ? 1 : -1; }))
#define STATIC_ASSERT(expr, msg) \
    extern int (*assert_function__(void)) [STATIC_ASSERT_HELPER(expr, msg)]
#else
    #define STATIC_ASSERT(expr, msg)   \
    extern char STATIC_ASSERTION__##msg[1]; \
    extern char STATIC_ASSERTION__##msg[(expr)?1:2]
#endif /* #ifdef __GNUC__ */

Вот сообщения об ошибках, о которых сообщают для STATIC_ASSERT(1==1, test_message); в строке 22 из test.c:

GCC:

line 22: error: negative width in bit-field `STATIC_ASSERTION__test_message'

Visual Studio:

test.c(22) : error C2369: 'STATIC_ASSERTION__test_message' : redefinition; different subscripts
    test.c(22) : see declaration of 'STATIC_ASSERTION__test_message'

Comeau:

line 22: error: declaration is incompatible with
        "char STATIC_ASSERTION__test_message[1]" (declared at line 22)

 
 

ИСХОДНЫЙ ОТВЕТ :

я делаю что-то очень похожее на то, какие Средства проверки делает. Но я включаю сообщение, которое это разоблачит во многих компиляторах:

#define STATIC_ASSERT(expr, msg)               \
{                                              \
    char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
    (void)STATIC_ASSERTION__##msg[0];          \
}

И для того, чтобы сделать что-то в глобальной области видимости (вне функции) использует это:

#define GLOBAL_STATIC_ASSERT(expr, msg)   \
  extern char STATIC_ASSERTION__##msg[1]; \
  extern char STATIC_ASSERTION__##msg[(expr)?1:2]
8
задан 10 July 2009 в 17:51
поделиться

3 ответа

Если вы просто хотите отсортировать, я бы использовал 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);
16
ответ дан 5 December 2019 в 08:54
поделиться

In the case that something is not directly supported ...make it so number 1!

Take a look at the concept of "extension methods". With this you can easily make your list support the concept of Swap() (this applies to any time you want to extend the functionality of a class).

    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;
            }
        }   
    }
1
ответ дан 5 December 2019 в 08:54
поделиться

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


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

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

2
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

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