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 程序中,我正在读取这些值并将它们填写在字典中,如下所示(只做几个,而不是完整的方法):

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 中有两个相机框架,但我认为使用字典可以让我很好地存储所有内容。

我还进行了检查,我的 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);
}

在这里,您将两个项目添加到字典中,两者都使用硬编码键。在此循环的第二次迭代中,代码将尝试添加第二个“CameraName”项并炸毁。

您使用 aDictionary而不是 a有什么特别的原因List<HV_Camera>吗?

于 2013-06-04T14:42:01.283 回答
0

在这条线上:

cameraDictionary.Add("CameraName", _cameraEntry);

您每次都将属性“CameraName”添加为键。这是需要独一无二的。

于 2013-06-04T14:41:49.003 回答