不,我不能使用通用集合。我想做的事实上非常简单。在PHP我会做这样的事情
$foo = [];
$foo[] = 1;
我在C#中拥有的是这个
var foo = new int [10];
// yeah that's pretty much it
现在我可以做foo[foo.length - 1] = 1
这样的事情,但显然不会有效。另一个选项是foo[foo.Count(x => x.HasValue)] = 1
以及声明期间可以为空的int。但有可以更简单地解决这个琐碎的任务。
这是家庭作业,我不想向我的老师(可能还有整个班级)解释foo[foo.Count(x => x.HasValue)] = 1
是什么以及它为何起作用等。
答案 0 :(得分:6)
最简单的方法是创建一个包含插入项的索引的新类:
public class PushPopIntArray
{
private int[] _vals = new int[10];
private int _nextIndex = 0;
public void Push(int val)
{
if (_nextIndex >= _vals.Length)
throw new InvalidOperationException("No more values left to push");
_vals[_nextIndex] = val;
_nextIndex++;
}
public int Pop()
{
if (_nextIndex <= 0)
throw new InvalidOperationException("No more values left to pop");
_nextIndex--;
return _vals[_nextIndex];
}
}
您可以添加重载以获取整个数组,或者如果您愿意,可以直接将其编入索引。您还可以添加重载或构造函数来创建不同大小的数组等。
答案 1 :(得分:2)
在C#中,无法动态调整数组大小。您可以使用Array.Resize(但这可能对性能有害)或替代ArrayList类型。
答案 2 :(得分:1)
但是必须有一个更简单的方法来解决这个微不足道的任务。
不。并非所有语言都能像对方一样简单,这就是为什么集合被发明的原因。 C#&lt;&gt; python&lt;&gt; php&lt;&gt; java的。选择最适合你的人,但从一种语言转到另一种语言时,总是不会有同等的努力。
答案 3 :(得分:0)
foo[foo.Length]
将无效,因为foo.Length索引位于数组之外
最后一项是索引foo.Length - 1
之后一个数组是一个固定大小的结构,如果你希望它与php一样工作你就是明显错误
答案 4 :(得分:0)
最初我写这篇评论作为评论,但我认为它包含足够重要的一点,值得将其作为答案。
你似乎认为C#是一种尴尬的语言,因为你固执地坚持使用数组,同时要求你应该把项目推到最后......这个评论就是证明:
不是将项目推入数组结构的整个目的吗?
要回答这个问题:不,数组数据结构的目的是拥有一个连续的预分配内存块,以模仿C(++)中的原始数组结构,您可以轻松地对其进行索引和执行指针运算。
如果您想要一个支持某些操作的数据结构,例如将元素推送到最后,请考虑System.Collections.Generic.List<T>
,或者,如果您坚持避免使用泛型,请考虑System.Collections.List
。有专门化指定底层存储结构(例如ArrayList
),但一般来说,C#库的重点在于您不想关注这些细节:List<T>
class对其操作有一定的保证(例如插入 O(n),检索是 O(1) - 就像数组一样)以及是否有数组或实际保存数据的某些链表是无关紧要的,实际上是根据运行时列表的大小和用例动态决定的。
要回答所写的问题,我会看到两个选项:
以笨拙的方式使用数组。创建一个Nullable<int>
的数组并接受一些装箱/拆箱和令人不愉快的LINQ语句以便插入;或保留一个额外的计数器(最好与数组一起包含在一个类中)以跟踪最后指定的元素。
使用适当的数据结构,并对重要的操作提供适当的保证,例如List<T>
,这实际上是上面第二个选项的(更好,优化的)内置版本。
我理解后一种选择对你来说是不可行的,因为老师施加的限制,但是如果你不被允许使用规范,那么不要惊讶于事情比另一种语言的规范方式更难。这种语言的方式。
有感:
刚想到的混合替代方案是使用List进行存储,然后只需在其上调用.ToArray
。在您的插入方法中,只需Add
到列表并返回新数组。