检查字典中的值

时间:2013-06-04 14:38:32

标签: c# xml dictionary

我正在阅读以下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,输入]。新增   (System.String键,条目值)

有人可以告诉我如何克服这个问题吗?我知道这是因为我的XML中有两个相机框架,但我认为我使用dictonary会让我存储好一切。

我还运行了一张支票,我的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!!!");
        }

2 个答案:

答案 0 :(得分:2)

字典由KeyValuePair个对象组成,每个Key在整个字典中必须是唯一的。

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

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

您使用Dictionary而不是List<HV_Camera>是否有任何特殊原因?

答案 1 :(得分:0)

在这一行:

cameraDictionary.Add("CameraName", _cameraEntry);

每次都要将属性“CameraName”添加为Key。这是必须独特的。