Compartir vía


Cómo: Convertir una colección .NET en un contenedor STL/CLR

En este tema se muestra cómo convertir colecciones de .NET en sus contenedores STL/CLR equivalentes. A modo de ejemplo, se muestra cómo convertir un List<T> de .NET en un vector STL/CLR y cómo convertir un Dictionary<TKey,TValue> de .NET en una asignación de STL/CLR, pero el procedimiento es similar para todas las colecciones y contenedores.

Para crear un contenedor a partir de una colección

  1. Para convertir una colección completa, cree un contenedor STL/CLR y pase la colección al constructor.

    En el primer ejemplo se demuestra este escenario.

O

  1. Cree un contenedor STL/CLR genérico mediante la creación de un objeto collection_adapter. Esta clase de plantilla toma una interfaz de colección de .NET como argumento. Para comprobar qué interfaces se admiten, consulte collection_adapter (STL/CLR).

  2. Copie el contenido de la colección .NET en el contenedor. Esto se puede hacer mediante un algoritmo de STL/CLR o iterando por la colección .NET e insertando una copia de cada elemento en el contenedor de STL/CLR.

    En el segundo ejemplo se muestra este procedimiento.

Ejemplos

En este ejemplo, se crea un List<T> genérico y se le agregan 5 elementos. A continuación, se crea un objeto vector con el constructor que toma IEnumerable<T> como argumento.

// cliext_convert_list_to_vector.cpp
// compile with: /clr

#include <cliext/adapter>
#include <cliext/algorithm>
#include <cliext/vector>

using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;

int main(array<System::String ^> ^args)
{
    List<int> ^primeNumbersColl = gcnew List<int>();
    primeNumbersColl->Add(2);
    primeNumbersColl->Add(3);
    primeNumbersColl->Add(5);
    primeNumbersColl->Add(7);
    primeNumbersColl->Add(11);

    cliext::vector<int> ^primeNumbersCont =
        gcnew cliext::vector<int>(primeNumbersColl);

    Console::WriteLine("The contents of the cliext::vector are:");
    cliext::vector<int>::const_iterator it;
    for (it = primeNumbersCont->begin(); it != primeNumbersCont->end(); it++)
    {
        Console::WriteLine(*it);
    }
}
The contents of the cliext::vector are:
2
3
5
7
11

En este ejemplo, se crea un Dictionary<TKey,TValue> genérico y se le agregan 5 elementos. A continuación, se crea un objeto collection_adapter para encapsular Dictionary<TKey,TValue> como un contenedor STL/CLR simple. Por último, creamos un elemento map y copiamos el contenido de Dictionary<TKey,TValue> en map mediante la iteración sobre collection_adapter. Durante este proceso, creamos un nuevo par mediante la función make_pair e insertamos el nuevo par directamente en map.

// cliext_convert_dictionary_to_map.cpp
// compile with: /clr

#include <cliext/adapter>
#include <cliext/algorithm>
#include <cliext/map>

using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;

int main(array<System::String ^> ^args)
{
    System::Collections::Generic::Dictionary<float, int> ^dict =
        gcnew System::Collections::Generic::Dictionary<float, int>();
    dict->Add(42.0, 42);
    dict->Add(13.0, 13);
    dict->Add(74.0, 74);
    dict->Add(22.0, 22);
    dict->Add(0.0, 0);

    cliext::collection_adapter<System::Collections::Generic::IDictionary<float, int>> dictAdapter(dict);
    cliext::map<float, int> aMap;
    for each (KeyValuePair<float, int> ^kvp in dictAdapter)
    {
        cliext::pair<float, int> aPair = cliext::make_pair(kvp->Key, kvp->Value);
        aMap.insert(aPair);
    }

    Console::WriteLine("The contents of the cliext::map are:");
    cliext::map<float, int>::const_iterator it;
    for (it = aMap.begin(); it != aMap.end(); it++)
    {
        Console::WriteLine("Key: {0:F} Value: {1}", it->first, it->second);
    }
}
The contents of the cliext::map are:
Key: 0.00 Value: 0
Key: 13.00 Value: 13
Key: 22.00 Value: 22
Key: 42.00 Value: 42
Key: 74.00 Value: 74

Consulte también

Referencia de la biblioteca STL/CLR
adapter (STL/CLR)
Cómo: Convertir un contenedor STL/CLR en una colección .NET