当前位置:  开发笔记 > 编程语言 > 正文

如何动态设置c#中的数组长度

如何解决《如何动态设置c#中的数组长度》经验,为你挑选了3个好方法。

我还是C#的新手,我一直在努力解决阵列上的各种问题.我有一组元数据对象(名称值对),我想知道如何只创建我真正需要的"InputProperty"对象的数量.在这个循环中,我任意设置元素的数量为20,当条目变为null时我试图挽救但是接收端的Web服务不喜欢传递给它的任何null元素:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[20];  // how to make this "dynamic"
    int i;
    for (i = 0; i < nvPairs.Length; i++)
    {
        if (nvPairs[i] == null) break;
        ip[i] = new InputProperty();
        ip[i].Name = "udf:" + nvPairs[i].Name;
        ip[i].Val = nvPairs[i].Value;
    }
    update.Items = ip;
    return update;
}

总之,假设我在上面的输入数组中只有3个名值对?不是为名为ip的数组分配20个元素,而是如何对此进行编码,以便ip只有它需要的大.更新对象通过另一个Web服务传递,因此序列化很重要(即我不能使用namevaluecollection等).

ps是通过"添加评论"工具跟踪已发布问题的唯一方法吗?



1> BFree..:
InputProperty[] ip = new InputProperty[nvPairs.Length]; 

或者,您可以使用如下列表:

List list = new List();
InputProperty ip = new (..);
list.Add(ip);
update.items = list.ToArray();

另外我要指出的一点是,在C#中,你可以在循环内部对for循环中的int变量使用:

for(int i = 0; i

只是因为我心情很好,这里有一种更清洁的方法来做这种方法IMO:

private Update BuildMetaData(MetaData[] nvPairs)
{
        Update update = new Update();
        var ip = new List();

        foreach(var nvPair in nvPairs)
        {
            if (nvPair == null) break;
            var inputProp = new InputProperty
            {
               Name = "udf:" + nvPair.Name,
               Val = nvPair.Value
            };
            ip.Add(inputProp);
        }
        update.Items = ip.ToArray();
        return update;
}



2> Jim Mischel..:

如果你不想使用List,ArrayList或其他动态大小的集合,然后转换成数组(这就是我想要推荐的方法,方式),那么你就必须到数组分配给它的最大可能大小,跟踪放入其中的项目数,然后创建一个只包含其中项目的新数组:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[20];  // how to make this "dynamic"
    int i;
    for (i = 0; i < nvPairs.Length; i++)
    {
        if (nvPairs[i] == null) break;
        ip[i] = new InputProperty(); 
        ip[i].Name = "udf:" + nvPairs[i].Name;
        ip[i].Val = nvPairs[i].Value;
    }
    if (i < nvPairs.Length)
    {
        // Create new, smaller, array to hold the items we processed.
        update.Items = new InputProperty[i];
        Array.Copy(ip, update.Items, i);
    }
    else
    {
        update.Items = ip;
    }
    return update;
}

另一种方法是始终分配update.Items = ip;,然后在必要时调整大小:

update.Items = ip;
if (i < nvPairs.Length)
{
    Array.Resize(update.Items, i);
}

它的代码较少,但最终可能会完成相同的工作量(即创建一个新数组并复制旧项目).



3> Brian..:

需要是一个数组吗?如果您使用ArrayList或C#中提供的其他对象之一,则不会对内容具有此限制.Hashtable,IDictionnary,IList等都允许动态数量的元素.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有