Как использовать BOOST_FOREACH с повышением:: ptr_map?

Вы можете сделать следующее:

public jsonResult Get()
{
  DbCommand cmd = _humanContext.DbContext.Database.GetDbConnection().CreateCommand()
 cmd.CommandText = "yourspName";
 cmd.CommandType = CommandType.StoredProcedure;


using (IDataReader reader = await cmd.ExecuteReaderAsync())
{
 List<Foo> items= reader.Select(r => r.GetYourPocoClassModel()).ToList();

string rItems = JsonConvert.SerializeObject(items, Formatting.Indented,
   new JsonSerializerSettings
   {
       ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });
 return rItems;
 }
}

и GetYourPocoClassModel для моделирования ваших данных:

public Calss HelperExtension
{
   public static Foo GetYourPocoClassModel(this IDataReader r)
   {
    return new Foo
    {
      Id=r["Id"] is DBNull ? 0 : Convert.ToDouble(r["Id"]),
    }
 }
}
12
задан Community 23 May 2017 в 12:04
поделиться

4 ответа

Как контейнеры стиля STL, контейнеры указателя имеют a value_type определение типа, которое можно использовать:

#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>

int main()
{
    typedef boost::ptr_map<int, int> int_map;
    int_map mymap;

    BOOST_FOREACH(int_map::value_type p, mymap)
    {
    }
}

Я нахожу, что использование определения типа для контейнера делает код намного легче записать.

Кроме того, необходимо постараться не использовать содержание detail пространства имен в повышении, это - конвенция повышения, что они содержат детали реализации.

16
ответ дан 2 December 2019 в 04:43
поделиться

Этот пример кода, скомпилированный для меня с g ++ 4.1.2:

#include "boost/ptr_container/ptr_map.hpp"
#include "boost/foreach.hpp"

int main()
{
    boost::ptr_map<int, int> mymap;

    typedef boost::ptr_container_detail::ref_pair<int, int* const> IntPair;
    BOOST_FOREACH(IntPair p, mymap)
    {
        int i = p.first;
    }

    return 0;
}
1
ответ дан 2 December 2019 в 04:43
поделиться

Это должно скомпилировать без ссылки:

BOOST_FOREACH (IntTpair p, mymap)

Я думаю, что проблема состоит в том, что карты на самом деле не хранят объекты как пар, но как древовидная структура с первым элементом как ключ, таким образом, BOOST_FOREACH не может получить ссылку на пару, но он может создать временную копию одной.

0
ответ дан 2 December 2019 в 04:43
поделиться

Сегодня я столкнулся с той же проблемой. К сожалению, предложение Дэниела не сработает при постоянной ссылке на карту. В моем случае ptr_map был членом класса, и я хотел зациклировать его в функции-член const. Позаимствовав пример Даниила, мне пришлось сделать это в моем случае:

#include "boost/ptr_container/ptr_map.hpp"
#include "boost/foreach.hpp"

int main()
{
    typedef boost::ptr_map<int, int> int_map;
    int_map mymap;
    const int_map& mymap_const_ref(mymap);

    BOOST_FOREACH(int_map::const_iterator::value_type p, mymap_const_ref)
    {
    }
}

Кажется, что int_map::const_iterator::value_type эквивалентно boost::ptr_container_detail::ref_pair.

.
8
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

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