0

次の XML データを読み込んでいます。

 <Settings>
  <Display_Settings>
    <Camera>
      <Name Name="" />
      <CameraTag Tag="1" />
      <LocalPosition X="1" Y="1" Z="1" />
      <Orientation Yaw="1" Pitch="1" Roll="1" />
      <Far Far="1" />
      <Near Near="1" />
      <FOV FOV="1" />
      <AspectRatio AspectRatio="1" />
      <ScreenDistance ScreenDistance="1" />
    </Camera>
    <Camera>
      <Name Name="Camera1" />
      <CameraTag Tag="2" />
      <LocalPosition X="2" Y="2" Z="2" />
      <Orientation Yaw="2" Pitch="2" Roll="2" />
      <Far Far="2" />
      <Near Near="2" />
      <FOV FOV="2" />
      <AspectRatio AspectRatio="1" />
      <ScreenDistance ScreenDistance="2" />
    </Camera>
  </Display_Settings>
</Settings>

次に、Unity プログラムでこれらの値を読み取り、次のように Dictionary に入力します (完全な方法ではなく、いくつかの方法のみを実行します)。

public struct Entry
{
    public System.Object value;
    public Type type;
}

void UpDate()
{
  var xdoc = XDocument.Load(@"C:\\Test.xml");
    var cameras = xdoc.Descendants("Camera");

 foreach (var camera in cameras)
 {
   // reading in values from XML
    HV_Camera _camera = new HV_Camera();
    _camera.Name = (string)camera.Element("Name").Attribute("Name");
    _camera.Tag = (string)camera.Element("CameraTag").Attribute("Tag");

    // filling out a dictionary
    _cameraEntry.type = typeof(string);
    _cameraEntry.value = (string)camera.Element("Name").Attribute("Name");
    cameraDictionary.Add("CameraName", _cameraEntry);

    _cameraEntry.type = typeof(string);
    _cameraEntry.value = (string)camera.Element("CameraTag").Attribute("Tag");
    cameraDictionary.Add("CameraTag", _cameraEntry);
      }
}

今、保存された値を割り当てる前に、辞書が正しく入力されているかどうかを確認するためのチェックを実行しようとしています。しかし、プログラムを実行すると、次のエラーが発生します。

ArgumentException: 同じキーを持つ要素が辞書に既に存在します。System.Collections.Generic.Dictionary`2[System.String,Entry].Add (System.String キー、エントリ値)

誰かがこの問題を克服する方法を教えてもらえますか? XMLに2つのカメラフレームワークがあるためだと思いますが、辞書を使用するとすべてをうまく保存できると思いました。

私もチェックを実行しましたが、私の XML は読み込まれます。したがって、それは問題ではありません。

これがばかげた質問であれば申し訳ありません。このレベルで辞書を使うのは初めてです。

編集

申し訳ありませんが、値を読み取る際に試したコードを追加するのを完全に忘れていました。

  foreach (KeyValuePair<string, Entry> pair in settings.cameraDictionary)
        {
            if (pair.Key == "FOV")
            {
                Debug.Log("This is a test!!!");
            }
        }

        if (settings.cameraDictionary.ContainsKey("CameraName"))
        {
            Debug.Log("This is a test!!!");
        }
4

2 に答える 2

2

ディクショナリはKeyValuePairオブジェクトで構成され、それぞれKeyがディクショナリ全体で一意である必要があります。

foreach (var camera in cameras) {
    ...
    cameraDictionary.Add("CameraName", _cameraEntry);
    ...
    cameraDictionary.Add("CameraTag", _cameraEntry);
}

ここでは、ハードコードされたキーを持つ 2 つの項目をディクショナリに追加しています。このループの 2 回目の繰り返しで、コードは 2 番目の「CameraName」項目を追加して爆破しようとします。

Dictionaryaではなく aを使用している特定の理由はありますList<HV_Camera>か?

于 2013-06-04T14:42:01.283 に答える
0

この行で:

cameraDictionary.Add("CameraName", _cameraEntry);

毎回キーとしてプロパティ「CameraName」を追加しています。これは、一意である必要があるものです。

于 2013-06-04T14:41:49.003 に答える