Procedura: conversione da raccolta .NET a contenitore STL/CLR
Questo argomento illustra come convertire le raccolte .NET nei contenitori STL/CLR equivalenti. Come esempio viene illustrato come convertire un file .NET List<T> in un vettore STL/CLR e come convertire un file .NET Dictionary<TKey,TValue> in una mappa STL/CLR, ma la procedura è simile per tutte le raccolte e i contenitori.
Per creare un contenitore da una raccolta
Per convertire un'intera raccolta, creare un contenitore STL/CLR e passare la raccolta al costruttore.
Il primo esempio illustra questa procedura.
-OPPURE-
Creare un contenitore STL/CLR generico creando un oggetto collection_adapter . Questa classe modello accetta un'interfaccia di raccolta .NET come argomento. Per verificare quali interfacce sono supportate, vedere collection_adapter (STL/CLR).
Copiare il contenuto della raccolta .NET nel contenitore. Questa operazione può essere eseguita usando un algoritmo STL/CLR o eseguendo l'iterazione sulla raccolta .NET e inserendo una copia di ogni elemento nel contenitore STL/CLR.
Il secondo esempio illustra questa procedura.
Esempi
In questo esempio viene creato un oggetto generico List<T> e vengono aggiunti 5 elementi. Viene quindi creato un vector
oggetto usando il costruttore che accetta un oggetto IEnumerable<T> come argomento.
// 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
In questo esempio viene creato un oggetto generico Dictionary<TKey,TValue> e vengono aggiunti 5 elementi. Viene quindi creato un collection_adapter
oggetto per eseguire il Dictionary<TKey,TValue> wrapping di come un semplice contenitore STL/CLR. Infine, si crea un oggetto map
e si copia il contenuto dell'oggetto nell'oggetto Dictionary<TKey,TValue> map
eseguendo l'iterazione collection_adapter
su . Durante questo processo viene creata una nuova coppia usando la funzione e si inserisce la make_pair
nuova coppia direttamente in 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
Vedi anche
Riferimenti alla libreria STL/CLR
adapter (STL/CLR)
Procedura: Convertire da contenitore STL/CLR a raccolta di .NET