How to set array length in c# dynamically

后端 未结 9 929
长情又很酷
长情又很酷 2020-12-30 23:45

I am still new to C# and I\'ve been struggling with various issues on arrays. I\'ve got an array of metadata objects (name value pairs) and I would like to know how to creat

相关标签:
9条回答
  • 2020-12-31 00:31
    InputProperty[] ip = new InputProperty[nvPairs.Length]; 
    

    Or, you can use a list like so:

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

    Another thing I'd like to point out, in C# you can delcare your int variable use in a for loop right inside the loop:

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

    And just because I'm in the mood, here's a cleaner way to do this method 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;
    }
    
    0 讨论(0)
  • 2020-12-31 00:34

    If you don't want to use a List, ArrayList, or other dynamically-sized collection and then convert to an array (that's the method I'd recommend, by the way), then you'll have to allocate the array to its maximum possible size, keep track of how many items you put in it, and then create a new array with just those items in it:

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

    An alternate method would be to always assign update.Items = ip; and then resize if necessary:

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

    It's less code, but will likely end up doing the same amount of work (i.e. creating a new array and copying the old items).

    0 讨论(0)
  • 2020-12-31 00:38

    You could use List inside the method and transform it to an array at the end. But i think if we talk about an max-value of 20, your code is faster.

        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;
        }
    
    0 讨论(0)
提交回复
热议问题