将项目推送到数组的末尾

时间:2015-11-09 21:30:51

标签: c# .net

不,我不能使用通用集合。我想做的事实上非常简单。在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是什么以及它为何起作用等。

5 个答案:

答案 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) - 就像数组一样)以及是否有数组或实际保存数据的某些链表是无关紧要的,实际上是根据运行时列表的大小和用例动态决定的。

不要尝试通过比较PHP数组和C#数组来比较PHP和C# - 它们具有不同的编程范例,并且解决问题的方法不一定会转移到另一个。

要回答所写的问题,我会看到两个选项:

  • 以笨拙的方式使用数组。创建一个Nullable<int>的数组并接受一些装箱/拆箱和令人不愉快的LINQ语句以便插入;或保留一个额外的计数器(最好与数组一起包含在一个类中)以跟踪最后指定的元素。

  • 使用适当的数据结构,并对重要的操作提供适当的保证,例如List<T>,这实际上是上面第二个选项的(更好,优化的)内置版本。

我理解后一种选择对你来说是不可行的,因为老师施加的限制,但是如果你不被允许使用规范,那么不要惊讶于事情比另一种语言的规范方式更难。这种语言的方式。

有感: 刚想到的混合替代方案是使用List进行存储,然后只需在其上调用.ToArray。在您的插入方法中,只需Add到列表并返回新数组。