我还是新的C#和我一直在与阵列的各种问题挣扎。我有元数据对象的数组(名称值对),我想知道如何创建只有我真正需要的“InputProperty”对象的数量。在这个循环中,我任意设定元件20的数量和我尝试跳伞当条目变为零,但是,这个接收端的网络服务不喜欢传递给它的任何空元素:

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 namevalue对上述输入数组中?而不是分配的阵列称为IP 20组的元素,如何编写这使IP协议只是大,因为它必须这样做。更新对象跨越另一web服务通过,以便串行化是很重要的(即,我不能使用的NameValueCollection等)。

P.S。通过“添加注释”设施上贴出的问题,以随动的唯一途径?

有帮助吗?

解决方案

如果你不想使用ListArrayList,或其他动态大小的集合,然后转换成数组(这就是我想要推荐的方法,方式),那么你就必须分配阵列到其最大可能的大小,跟踪你放了多少物品,然后创建只有在它的项目一个新的数组:

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);
}

这是较少的代码,但可能将最终做相同的工作量(即创建新阵列和复制旧的项目)。

其他提示

InputProperty[] ip = new InputProperty[nvPairs.Length]; 

或者,你可以使用一个列表,像这样:

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

另一件事我想指出的是,在C#中,你可以delcare你的int变量使用一个for循环右循环内:

for(int i = 0; i<nvPairs.Length;i++
{
.
.
}

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

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

        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;
}

是否被需要是一个数组?如果您使用ArrayList或者在C#中可用的其它目的之一,你不会有这样的限制含量。哈希表,IDictionnary,IList的,等等。所有允许元件的动态数。

使用这样的:

 Array.Resize(ref myArr, myArr.Length + 5);

您可以使用列表中的方法内,并在端将其转换为一个数组。但我想,如果我们谈论20的最大价值,你的代码是更快的。

    private Update BuildMetaData(MetaData[] nvPairs)
    {
        Update update = new Update();
        List<InputProperty> ip = new List<InputProperty>();
        for (int 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.ToArray();
        return update;
    }

或者使用System.Linq在C#3.0则可以跳过中间列表:

private Update BuildMetaData(MetaData[] nvPairs)
{
        Update update = new Update();
        var ip = from nv in nvPairs
                 select new InputProperty()
                 {
                     Name = "udf:" + nv.Name,
                     Val = nv.Value
                 };
        update.Items = ip.ToArray();
        return update;
}

使用Array.CreateInstance动态创建的阵列。

    private Update BuildMetaData(MetaData[] nvPairs)
    {
        Update update = new Update();
        InputProperty[] ip = Array.CreateInstance(typeof(InputProperty), nvPairs.Count()) as InputProperty[];
        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;
    }

典型地,阵列需要常量来初始化它们的大小。你可以nvPairs扫过一次,以得到长度,然后在“动态”创建使用可变像这样长度的数组。

InputProperty[] ip = (InputProperty[])Array.CreateInstance(typeof(InputProperty), length);

我不会推荐它,虽然。只要坚持与

List<InputProperty> ip = ...
...
update.Items = ip.ToArray();

溶液。这并不是说更高性能和更好的方式寻找。

可以以这种方式动态地创建一个数组:

 static void Main()
    {
        // Create a string array 2 elements in length:
        int arrayLength = 2;
        Array dynamicArray = Array.CreateInstance(typeof(int), arrayLength);
        dynamicArray.SetValue(234, 0);                              //  → a[0] = 234;
        dynamicArray.SetValue(444, 1);                              //  → a[1] = 444;
        int number = (int)dynamicArray.GetValue(0);                      //  → number = a[0];


        int[] cSharpArray = (int[])dynamicArray;
        int s2 = cSharpArray[0];

    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top