【问题标题】:Populate array of objects from namevaluecollection in c#从 c# 中的 namevaluecollection 填充对象数组
【发布时间】:2009-03-19 18:22:17
【问题描述】:

我是 C# 新手。这是我开始工作的硬编码:

InputProperty grantNumber = new InputProperty();
grantNumber.Name = "udf:Grant Number";
grantNumber.Val = "571-1238";

Update update = new Update();
update.Items = new InputProperty[] { grantNumber };

现在我想将其概括为支持 Update 对象中无限数量的项目,我想出了这个但它无法编译:

Update update = BuildMetaData(nvc);  //call function to build Update object

这里的函数本身:

private Update BuildMetaData(NameValueCollection nvPairs)
{
    Update update = new Update();
    InputProperty[] metaData;       // declare array of InputProperty objects
    int i = 0;
    foreach (string key in nvPairs.Keys)
    {
        metaData[i] = new InputProperty();      // compiler complains on this line
        metaData[i].Name = "udf:" + key;
        foreach (string value in nvPairs.GetValues(key))
            metaData[i].Val = value;
    }
    update.Items = metaData;
    return update;      // return the Update object
}

【问题讨论】:

  • 编译器的错误信息是什么?
  • 使用未赋值的局部变量'metaData'

标签: c# arrays object namevaluecollection


【解决方案1】:

由于您的 Items 集合的大小可能会有所不同,因此您应该使用 List<T> 或 Dictionary<K,V> 之类的集合类型,而不是数组。

【讨论】:

  • 我试图在我的问题的开头展示如何为 update.Items 分配一个 InputProperty 对象数组。我还不懂列表和字典。
  • 现在是学习的好时机。这些类被大量使用。
  • 我在哪里可以找到关于这个语法的很好的介绍信息,如 List 中的 符号?每次我看到 Dictionary 或 List 之类的语法时,我都会晕头转向,需要好好介绍一下。
  • 真正的简短版本是 T、K 或 V 只是类型名称(如 string 或 int)的占位符。当您将类型名称放入其中时,您就是在告诉类它仅适用于该类型的项目。
  • 我想补充一点我的谦虚——了解 List 和 Dictionary 是一个很棒的主意。它们是无价的(无所不在的)工具。在您可以了解泛型的许多地方(使用 构造的类)中,我喜欢 msdn.microsoft.com/en-us/library/512aeb7t.aspx。
【解决方案2】:

对于当前编译错误,需要初始化metaData数组,如:

InputProperty[] metaData = new InputProperty[](nvPairs.Count);

使用 linq 你可以:

private Update BuildMetaData(NameValueCollection nvPairs)
{
    Update update = new Update();
    update.Items = nvPairs.Keys
        .Select(k=> new InputProperty
                    {
                       Name = "udf:" + k,
                       Val = nvPairs[k] // or Values = nvPairs.GetValues(k)
                    }
         )
        .ToArray();
    return update;      // return the Update object
}

【讨论】:

  • 正是我想说的......(如果我及时阅读了这个问题!);-)
  • 不过应该​​是“nvPairs.Count”。
  • @Cerebrus 已修复 - 如果我在 IDE 中,它总是一个或另一个 :)
【解决方案3】:

如果我没记错的话,你的 InputProperty 数组永远不会被初始化。如果您将第 2 行更改为:

InputProperty[] metaData = new InputProperty[nvPairs.Count];

这应该可以解决问题。

【讨论】:

    【解决方案4】:

    当您声明数组 InputProperty[] 元数据时,您没有对其进行初始化。因此,当您尝试访问某个成员时,它根本不存在,这就是您遇到错误的原因。

    按照 Joel 的建议,我建议您查看 System.Collections.Generic 中提供的集合类型以找到合适的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2018-09-10
      • 2018-11-14
      • 2020-02-23
      相关资源
      最近更新 更多