用默认值填充List<int>?

73

可能重复:
C#自动初始化列表

我有一个整数列表,具有特定的容量,我希望在声明时能够自动填充。

List<int> x = new List<int>(10);

有没有更简单的方法来填充这个列表,使它包含10个默认值为int类型的整数,而不是通过循环并添加元素的方式?


1
还有https://dev59.com/THRB5IYBdhLWcg3w6bcE和其他一些。 - Mark Byers
1
是的,我的问题是那个第一个问题的重复。 - BLG
对我来说,它看起来是重复的,但实际上并不是。并非所有程序员都知道Java数组的初始化方法。 - nyconing
5个回答

162

好的,你可以让 LINQ 为你执行循环:

List<int> x = Enumerable.Repeat(value, count).ToList();

不清楚你所说的“默认值”是指0还是自定义的默认值。

你可以通过创建一个数组来稍微提高效率(在执行时间上更好;但占用内存更多):

List<int> x = new List<int>(new int[count]);

这将从数组中进行块复制到列表中,这可能比 ToList 所需的循环更有效率。


5
我希望你能有一种甜蜜的小方法来做这件事,就像'new List<int>(10).Fill()'这样。谢谢快速回答。 - BLG
@JonSkeet:自定义类列表是否可以实现这个功能?例如:List<Items> listOfItems,其中 public Items {int id; DateTime currentDateTime;}。需要让 currentDateTime 的值相同。有可能吗? - Praveen
@user1671639:不太清楚你在问什么(也不知道为什么“Items”应该是复数而不是“Item”)。创建一个有很多“默认”条目的列表有什么用处呢?我建议你提出一个更详细的新问题。 - Jon Skeet
@JonSkeet:我会提出一个新问题。谢谢Jon。 - Praveen
嘿@JonSkeet,你会如何处理List<List<int>>的问题?我已经在这里提出了问题(http://stackoverflow.com/questions/40313729/initialize-a-listlistt-with-default-values) - parsh

17
int defaultValue = 0;
return Enumerable.Repeat(defaultValue, 10).ToList();

13

如果您有一个固定长度的列表,并且希望所有元素都具有默认值,那么您可以考虑使用数组:

int[] x  = new int[10];

另外,这可能是一个适合自定义扩展方法的好地方:

public static void Fill<T>(this ICollection<T> lst, int num)
{
    Fill(lst, default(T), num);
}

public static void Fill<T>(this ICollection<T> lst, T val, int num)
{
    lst.Clear();
    for(int i = 0; i < num; i++)
        lst.Add(val);
}

然后你甚至可以为List类添加一个特殊的重载,以填充到容量:

public static void Fill<T>(this List<T> lst, T val)
{
    Fill(lst, val, lst.Capacity);
}
public static void Fill<T>(this List<T> lst)
{
    Fill(lst, default(T), lst.Capacity);
}

然后你可以直接说:
List<int> x  = new List(10).Fill();

6
是的。
int[] arr = new int[10];
List<int> list = new List<int>(arr);

2
var count = 10;
var list = new List<int>(new int[count]);

ADD

这是一个通用的方法,可以获取带有默认值的列表:

    public static List<T> GetListFilledWithDefaulValues<T>(int count)
    {
        if (count < 0)
            throw new ArgumentException("Count of elements cannot be less than zero", "count");

        return new List<T>(new T[count]);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接