0

I tried iterating over a NameValueMap using a 0-based index but it did not work. Iterating over it using a 1-based index worked.

Did not work.

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   // Did not work. Got an exception.
   for ( int i = 0; i < context.Count; ++i )
   {
      string name = context.Name[i];
      string value = (string)context.Value[name];
   }
}

Worked.

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   // Worked.
   for ( int i = 1; i <= context.Count; ++i )
   {
      string name = context.Name[i];
      string value = (string)context.Value[name];
   }
}

I was surprised by that. Is that expected?

I also noticed that NameValueMap inherits IEnumerable. I tried using foreach to get the items of the NameValueMap. However, that only gave me the values of the items. Is there a way to get the names of the items as well?

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   foreach ( var item in context )
   {
      // How do you get the name?
      string value = item;
   }
}
4

2 回答 2

1

互联网上关于这NameValueMap方面的信息很少,因此很难判断是否有现有的方法可以利用。

但是,您始终可以创建一个扩展方法来满足您的需求:

public static class NameValueMapExtensions
{
    public static IEnumerable<KeyValuePair<object, T>> AsEnumerable<T>(this NameValueMap map)
    {
        for (int i = 1; i <= map.Count; i++)
            yield return new KeyValuePair<object, T>(
                map.Name[i], (T)map.Values[map.Name[i]]);
    }
}

// ...

foreach (var item in context.AsEnumerable())
{
    // item.Key: Name
    // item.Value: ...
}
于 2017-09-07T16:46:37.437 回答
0

由于 NameValueMaps 不包含很多元素,您也可以只返回一个完整的 Dictionary,而不是产生 KeyValuePair 元素。这使您可以访问一些方便的方法,例如.TryGetValue().

public static class NameValueMapExtensions
{
    public static IDictionary<string, object> ToDictionary(this NameValueMap nameValueMap)
    {
        var dictionary = new Dictionary<string, object>();
        for (var i = 1; i <= nameValueMap.Count; i++)
            dictionary.Add(nameValueMap.Name[i], nameValueMap.Value[nameValueMap.Name[i]]);
        return dictionary;
     }
}
于 2021-03-01T11:48:51.097 回答