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

在c#中设置/扩展List <T>长度

如何解决《在c#中设置/扩展List<T>长度》经验,为你挑选了1个好方法。

鉴于List在c#中有一种方法可以扩展它(在其容量内)并将新元素设置为null?我想要的东西就像一个memset.我不是在寻找糖,我想要快速的代码.我知道在C语言中,操作可以在每个条目1-3个asm操作中完成.

我已经找到了最好的解决方案是这样:

list.AddRange(Enumerable.Repeat(null, count-list.Count));

然而,这是c#3.0(首选<3.0),可能正在生成和评估枚举器.

我目前的代码使用:

while(list.Count < lim) list.Add(null);

所以这是时间成本的起点.

这样做的动机是我需要设置第n个元素,即使它是在旧的Count之后.



1> Hosam Aly..:

最简单的方法可能是创建一个临时数组:

list.AddRange(new T[size - count]);

size所需的新大小在哪里,并且count是列表中的项目数.但是,对于相对较大的值size - count,这会导致性能不佳,因为它可能导致列表重新分配多次.(*)它还有一个缺点,即分配一个额外的临时数组,根据你的要求,这可能是不可接受的.您可以使用以下方法以更明确的代码为代价来缓解这两个问题:

public static class CollectionsUtil
{
    public static List EnsureSize(this List list, int size)
    {
        return EnsureSize(list, size, default(T));
    }

    public static List EnsureSize(this List list, int size, T value)
    {
        if (list == null) throw new ArgumentNullException("list");
        if (size < 0) throw new ArgumentOutOfRangeException("size");

        int count = list.Count;
        if (count < size)
        {
            int capacity = list.Capacity;
            if (capacity < size)
                list.Capacity = Math.Max(size, capacity * 2);

            while (count < size)
            {
                list.Add(value);
                ++count;
            }
        }

        return list;
    }
}

这里唯一的C#3.0是使用" this"修饰符来使它们成为扩展方法.删除修饰符,它将在C#2.0中工作.

不幸的是,我从未比较过这两个版本的性能,所以我不知道哪个更好.

哦,你知道你可以通过电话调整阵列大小Array.Resize吗?我不知道.:)

更新:
(*)使用list.AddRange(array)不会导致枚举使用.通过Reflector进一步观察显示数组将被转换为ICollection,并且Count将使用该属性以便仅分配一次.

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