c++ /CLI将ValuePairs复制到单独的Dictionary中

C++/CLI Copy ValuePairs to a seperate Dictionary

本文关键字:单独 Dictionary 复制 CLI ValuePairs c++      更新时间:2023-10-16

首先,我想谈谈我的最后一个问题:https://stackoverflow.com/questions/31823483/c-cli-set-a-property-to-primarykey

所以我得到了这个固定的答案,我没有找到在第一时间。

现在代码看起来像这样:

public: void SetData(Generic::Dictionary<String^,TypeName>^ Dic) {
    array<KeyValuePair<String^,TypeName>^>^ TempConv = gcnew array<KeyValuePair<String^, TypeName>^>(Dic->Count);
    ((Generic::Dictionary<String^, TypeName>^)Dic)->CopyTo(TempConv,0);
    TempEntityDic = gcnew Dictionary<String^, TypeName>(Dic);
    DataListe = gcnew List<TypeName>();
    for each(KeyValuePair<String^,TypeName>^ t in TempConv){        
        DataListe->Add(t->Value);
    }
    // Creating Bindable List
    BindingDataListe = gcnew BindingList<TypeName>(DataListe);
    BindingDataListe->AddingNew += gcnew System::ComponentModel::AddingNewEventHandler(this, &mepla_iso::Visualisation::ListenAnsicht<TypeName>::OnAddingNew);
    // Source festlegen
    ListenAnsichtGrid->DataSource = BindingDataListe;
    // Display the column Name first
    ListenAnsichtGrid->Columns["Name"]->DefaultCellStyle->Font = gcnew Drawing::Font(gcnew Drawing::Font("Consolas", 12), Drawing::FontStyle::Bold);
    ListenAnsichtGrid->Columns["Name"]->DisplayIndex = 0;
}

我目前遇到的问题是,我的TempEntityDic(临时字典)不是一个临时字典。上面的代码甚至不能正确编译。错误信息:

System::Collections::Generic::ICollection<System::Collections::Generic::KeyValuePair<System::String ^,TypeName>>::CopyTo': the function template cannot convert parameter 1 from type 'cli::array<System::Collections::Generic::KeyValuePair<System::String ^,TypeName> ^,1> ^

之前我尝试过:

public: void SetData(...){
    TempEntityDic = gcnew Dictionary<String^, TypeName>(Dic);
    DataListe = gcnew List<TypeName>();
    for each(TypeName t in TempEntityDic){      
        DataListe->Add(t);
  [...............]
}

但那里是一样的。每当我改变DataGridView中的某些内容时,我也会对Dic (SetData()中的参数)进行更改。

问题1制作参数"Dic"的副本而不是引用的最佳方法是什么?问题2我如何获得CopyTo()工作,以便我可以随后将TempConv中的所有KeyValuePairs添加到DataListe中?

谢谢你的帮助。:)

编辑说得清楚一点:最后我想要两本独立的字典。如果需要,我想用第二个覆盖第一个。

编辑2

你好,这里是我的代码再次。我仍在努力使事情运转起来,但就是找不到解决办法。

public: void SetData(Generic::Dictionary<String^,TypeName>^ Dic) {
    //HACK: Kopie von Dic erstellen - Keine Reference
    array<KeyValuePair<String^,TypeName>>^ TempConv = gcnew array<KeyValuePair<String^, TypeName>>(Dic->Values->Count);
    ((Generic::IDictionary<String^, TypeName>^)Dic)->CopyTo(TempConv,0);

    Dictionary<String^, TypeName>^ TempEntityDic = gcnew Dictionary<String^, TypeName>();
    for each(KeyValuePair<String^, TypeName> t in Dic)
        TempEntityDic->Add(t.Key,t.Value);
    Dic = gcnew Dictionary<String^, TypeName>(TempEntityDic);
    DataListe = gcnew List<TypeName>(Dic->Values);
    // Creating Bindable List
    BindingDataListe = gcnew BindingList<TypeName>(DataListe);

    // Source festlegen
    ListenAnsichtGrid->DataSource = BindingDataListe;
    // Display the column Name 
    ListenAnsichtGrid->Columns["Name"]->DefaultCellStyle->Font = gcnew Drawing::Font(gcnew Drawing::Font("Consolas", 12), Drawing::FontStyle::Bold);
    ListenAnsichtGrid->Columns["Name"]->DisplayIndex = 0;
}

我也在这里尝试,在TempEntityDic中创建一个新的Dic实例,然后以另一种方式复制它,但这根本不起作用。

你能帮帮我吗?我只是不能让它在不引用第一个字典的情况下创建一个单独的字典

字典。CopyTo只复制值,而不是键值对-这似乎是你的错误。使用array<TypeName>^代替array<KeyValuePair<String^, TypeName>^>^