Методы расширения IEnumerable на перечислении

В вопросе №1 разделим его на две части. Во-первых, увеличьте любой документ, который имеет «items.item_name», равный «my_item_two». Для этого вам придется использовать позиционный оператор «$». Что-то вроде:

 db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } , 
                {$inc : {"items.$.price" : 1} } , 
                false , 
                true);

Обратите внимание, что это только увеличит первый подобранный поддокумент в любом массиве (так что если у вас есть другой документ в массиве с «item_name», равным «my_item_two», он не будет получить прирост). Но это может быть то, что вы хотите.

Вторая часть сложнее. Мы можем вывести новый элемент в массив без «my_item_two» следующим образом:

 db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} , 
                {$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
                false , 
                true);

Для вашего вопроса №2 ответ проще. Чтобы увеличить общую сумму и цену item_three в любом документе, который содержит «my_item_three», вы можете одновременно использовать оператор $ inc на нескольких полях. Что-то вроде:

db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
               {$inc : {total : 1 , "items.$.price" : 1}} ,
               false ,
               true);
25
задан ahawker 17 November 2009 в 22:07
поделиться

2 ответа

Enum.GetValues ​​ возвращает System.Array и System.Array реализует только IEnumerable , а не ] IEnumerable , поэтому вам нужно будет использовать метод расширения Enumerable.OfType для преобразования IEnumerable в IEnumerable следующим образом:

Enum.GetValues(typeof(Suit))
            .OfType<Suit>()
            .Where(x => x != param);

Изменить: Я удалил вызов IEnumerable.Select , поскольку это была лишняя проекция без какого-либо значимого перевода. Вы можете свободно фильтровать IEnumerable , который возвращается из OfType .

42
ответ дан 28 November 2019 в 20:51
поделиться

Массив реализует IEnumerable, поэтому вам нужно будет использовать Cast<Suit> или OfType<Suit>, чтобы получить расширения IEnumerble<T>, такие как ToList ();

7
ответ дан Lee 15 October 2019 в 16:04
поделиться
Другие вопросы по тегам:

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