Gewusst wie: Konvertieren Sie von einer .NET-Auflistung zu einem STL/CLR-Container
In diesem Thema wird erläutert, wie .NET-Auflistungen mit ihren Containern der STL/CLR konvertiert.Als Beispiel veranschaulichen wir an, wie .NET List<T> zu einem STL/CLR Vektor konvertiert und wie .NET Dictionary<TKey, TValue> zu einem STL/CLR Zuordnung konvertiert, aber die Prozedur ist für alle Auflistungen und Containern vergleichbar.
So erstellen Sie einen Container mit einer Auflistung
Um eine gesamte Auflistung zu konvertieren, müssen Sie einen STL/CLR-Container und führen Sie die Auflistung an den Konstruktor.
Im ersten Beispiel wird dieses Verfahren veranschaulicht.
– ODER –
Erstellen Sie einen generischen STL/CLR-Container, indem Sie ein collection_adapter-Objekt erstellen.Diese Vorlagenklasse erwartet eine .NET-Auflistungs Oberfläche als Argument.Um zu überprüfen, welche Schnittstellen unterstützt werden, finden Sie unter collection_adapter (STL/CLR).
Kopieren Sie den Inhalt der .NET-Auflistung an den Container.Dies kann erfolgen, indem ein STL/ Algorithmus CLR verwendet oder indem Sie auf die .NET-Auflistung durchläuft und eine Kopie jedes Elements in STL/CLR-Container einfügt.
Das zweite Beispiel veranschaulicht diesen Vorgang.
Beispiel
In diesem Beispiel erstellen wir eine generische List<T> 5, und fügen Sie Elemente hinzu.Anschließend erstellen Sie vector mithilfe des Konstruktors, der IEnumerable<T> als Argument verwendet.
// 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);
}
}
In diesem Beispiel erstellen wir eine generische Dictionary<TKey, TValue> 5, und fügen Sie Elemente hinzu.Anschließend erstellen Sie collection_adapter, um Dictionary<TKey, TValue> als einfacher STL/CLR-Container zu umschließen.Schließlich erstellen Sie map kopieren und die Inhalte Dictionary<TKey, TValue> zu map, indem wir collection_adapter zu durchlaufen.Während dieses Prozesses erstellen Sie ein neues Paar, indem wir die make_pair-Funktion verwenden, und fügen Sie die neuen Paares direkt in map ein.
// 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);
}
}
Siehe auch
Aufgaben
Gewusst wie: Konvertiert von einem STL/CLR-Container zu einer .NET-Auflistung