有条件地创建具有输出参数的新集合

时间:2013-04-17 22:38:35

标签: c# collections

此计划纯粹是为了说明目的。我想取一个整数作为输入,如果它大于零,则在ArrayList中创建一个带有该整数的ArrayList。我尝试了这么多(不正确的)方法,并最终确定了你在下面看到的内容。但是,我并不喜欢它的外观。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter in a number of the size of the ArrayList that you want: ");
            int arraySize = int.Parse(Console.ReadLine());
            if (arraySize > 0)
            {
                ArrayList newList = CreateList(arraySize,out newList);
                newList.Add(arraySize);
                Console.WriteLine("the size of the array is {0}",newList.Count);
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("You did not create an ArrayList");
            }
            Console.WriteLine("here you can't access the array");
            Console.ReadLine();




        }
        public static ArrayList CreateList(int x,out ArrayList outList)
        {
            ArrayList al = new ArrayList(x);
            outList= al;
            return outList;

        }
    }

我的思维过程是,如果用户决定某个动作,那么程序就不会创建一个ArrayList来节省资源(考虑到这个例子的傻例子,我知道)。但是,我仍然必须在main方法中初始化一个ArrayList,如果我取出行newList.Add(arraySize),如果用户输入一个大于0的数字,程序将以0的输出运行。有什么方法可以这样任何大于0的输入都会导致一个已经准备好添加元素的ArrayList?因此,如果我们注释掉行newList.Add(arraySize),程序仍然会将ArrayList的大小打印为1(假设该数字大于0)

在此示例中,元素数量最多为1,而不是用户可能输入的数量。

4 个答案:

答案 0 :(得分:2)

一条评论: 您不必将返回类型放入函数中试试这个:

ArrayList newList =null;
CreateList(arraySize,out newList);


public static void CreateList(int x,out ArrayList outList)
{
   outList = new ArrayList(x);
}

答案 1 :(得分:2)

这里出现了很多问题。

首先,您不能添加列表的大小。它在构造函数中初始化,然后随着添加和删除元素而增长和缩小。

所以这一行:

newList.Add(arraySize);

误导,几乎肯定不是你想要的。您要么添加一个元素(在这种情况下变量名称具有误导性),或者您想设置数组的大小或容量,在这种情况下代码没有按照您的意愿执行。

您可能应该注意的列表的 size capacity 之间也存在差异:

  • 大小是数组中元素的数量。
  • 容量是列表基础数组的大小,在任何时间点都等于或大于列表的 size

当您将列表初始化为其他值时,这就是您对 Count 的调用返回0的原因。 Count 是指列表中的项目数,而不是内部数组的长度。您想要改为调用容量属性:

Console.WriteLine("the size of the array is {0}", newList.Capacity);

列表( ArrayList List )在内部使用数组,它们具有固定大小。所以容量是指该数组的长度。当您向阵列已满的列表中添加新元素时,列表的 Add 方法会创建一个新数组,该数组的长度是旧数组的两倍,将所有元素复制到较大的数组,追加最后的新值,并丢弃旧数组。

简而言之,功能:

public static ArrayList CreateList(int x,out ArrayList outList) {
    ArrayList al = new ArrayList(x);
    outList= al;
    return outList;
}

大多数情况下都可以,但有些多余,因为它应该使用out参数或返回列表,而不是两者。对于你的情况,我会做类似的事情:

public static void CreateList<T>(int capacity, out List<T> list) {
    list = new List<T>(capacity);
}

尽管这是一个非常毫无意义的方法。

答案 2 :(得分:1)

ArrayList constructor中的Int参数是“初始容量”,这是一种性能特征(在添加项目直到达到最大容量时,列表不会调整大小),因此它没有什么区别列出的实际大小。如果您想返回包含一个项目的列表,请在CreateList函数中添加该项目。

答案 3 :(得分:1)

因为,你很难理解你的问题是什么,我会在黑暗中进行拍摄。这就是你想要的:

using System;
using System.Collections;

namespace SO16071463
{
    class Program
    {
        static void Main()
        {
            Console.Write("Enter in a number of the size of the ArrayList that you want: ");
            int arraySize = int.Parse(Console.ReadLine());
            if (arraySize > 0)
            {
                ArrayList newList = new ArrayList { arraySize };
                Console.WriteLine("the size of the array is {0}", newList.Count);
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("You did not create an ArrayList");
            }
            Console.WriteLine("here you can't access the array");
            Console.ReadLine();
        }
    }
}