【问题标题】:How To Know If List is Full如何知道列表是否已满
【发布时间】:2021-06-22 21:11:51
【问题描述】:

我创建了一个固定大小的List

private List<ushort> responseData = new List<ushort>(7);

项目已添加到反应性可观察对象上,但我想知道每个订阅是否已满。

目前已被检查

if (responseData.Count == 7)

由于 responseData 的大小是动态的,我不会在 List 的初始化和检查它是否已满时使用静态的 7。但是,我只是想知道我是否已经设置了 responseData 大小;不再次使用尺寸参考就不能检查吗?

我非常重视任何回应。

【问题讨论】:

  • 您在寻找responseData.Count == responseData.Capacity吗?
  • 嗯,7 只是初始大小。除此之外,基础数据结构将被扩展以处理新项目。似乎您想要一个具有最大大小的列表。如果是这样,您需要提供有关您计划如何使用它的更多信息。
  • 您可以为 List 实现一个名为 IsFull() 的扩展方法,并且 List 的任何实例都可以访问此扩展方法...此文档可能会有所帮助:@987654321 @
  • 现在我不确定您到底在寻找什么。您始终可以编写一个名为IsFull 的扩展方法,最终检查responseData.Count == responseData.Capacity。您能否准确地定义“已满”的含义以及“更可靠或更智能的方法”的含义(即当前的方法如何不可靠、不智能)?
  • 一个列表不可能是满的。它可以存储无限数量的项目。如果您想使用具有固定容量但实际上会被填满的数据结构,则需要使用不同的数据结构(可能是由 List 支持的数据结构,但这实际上以某种方式防止自身超出容量)和可以有成员来指示它是否已满,或者任何其他对具有容量的集合有意义的操作。

标签: c# list unity3d


【解决方案1】:

如果我理解正确,您可能会想到List&lt;T&gt;.Capacity 属性?

当您初始化列表时,您可以指定内部容量,它表示在需要调整大小之前可以添加到列表中的项目数。列表容量的默认值为 4 [曾经是,需要确认它仍然是]。

所以,如果您这样创建一个新列表:

var myList = new List<int>(100);

您可以创建一个扩展方法来为您添加和检查:

public static class ListExtension
{
    public static bool Add<T> ( this List<T> list, T item, out bool isFull )
    {
        isFull = false;
        if ( list.Count == list.Capacity )
        {
            isFull = true;
            return false;
        }

        list.Add ( item );
        isFull = list.Count == list.Capacity;
        return true;
    }
}

现在,这在 Microsoft docs 中有说明:

Capacity 总是大于或等于 Count。如果计数超过 容量增加元素,容量增加 在复制旧数组之前自动重新分配内部数组 元素并添加新元素。

因此,扩展方法应该只允许您将项目添加到初始Capacity,而不能再添加。像这样使用时,var success = myList.Add(item, out var isFull)isFull 会指示列表是否已满。返回值将指示操作是否成功。

【讨论】:

  • 我明白了,我想我的问题是不可能的,我了解到我们将不得不使用== 操作数。但是检查这个属性回答了我的问题,因为我们不必再次使用7 或变量。此外,它更安全。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多