【问题标题】:Store string data using an array (C#)使用数组存储字符串数据 (C#)
【发布时间】:2016-04-15 19:05:47
【问题描述】:

即使经过数小时的尝试,我似乎也无法解决的任务。

基本上,我有一个接受用户输入的电话簿:姓名和号码(均为字符串类型),它变成了一个联系人。 我应该将联系人存储在 Array 中,并且用户应该能够通过 Create 和 Delete 方法从数组中添加和删除数据(联系人)。

我做了一个自己的Repository类来处理数据(Contact也有一个自己的小类),但是我使用List来存储数据,所以我可以简单使用添加和删除,所以我的代码如下所示:

public class Repository
{
    List<Contact> storagelist;

    public Repository() {
        storagelist = new List<Contact>();
    }


    public void Create(Contact item) //Adds the item to the list
    { 
        storagelist.Add(item);
    }

    public bool Delete(Contact item) //Removes the item 
    {
        if (!storagelist.Contains(item)) 
            return false;
        storagelist.Remove(item);
        return true;
    }

}

我正在寻找的是如何做到这一点,具有添加和删除联系人的这两个功能,但将数据存储在 Array 中。

由于数组(据我所知)必须具有固定的预定义大小,我不知道如何以与 List 完全相同的方式使用它。数组大小应始终与存储的联系人数量相同,但是当数组大小固定时如何做到这一点?

那么,如何创建一个始终与存储的联系人数量相同大小的数组,以及如何在该数组中添加和删除?

非常感谢您的帮助!

编辑:感谢所有回复!每个答案在此过程中都有帮助(尤其是 Omar 和 person66!)。 我通过在删除元素之后“移动”整个数组来解决删除问题,降低 1 个索引,最后将数组调整为更小。像这样:

int deleteIndex = Array.IndexOf(storagelist, item);

        for (int index = deleteIndex + 1; index < storagelist.Length; index++)
        {
            storagelist[index - 1] = storagelist[index];
        }

        Array.Resize(ref storagelist, storagelist.Length - 1);

【问题讨论】:

  • 这是作业吗?为什么应该使用数组?如果您需要将列表传递到其他地方作为一个数组,您可以调用列表的ToArray() 方法
  • “数组大小应始终与存储的联系人数量相同”,这是要求吗?不可能有一个改变大小的数组。您可以创建新数组:添加联系人时,您分配一个全新的数组,该数组比您分配的前一个元素大 1 个元素,或者删除时小 1 个元素的新数组,等等。或者您从一个非常大的单个数组,然后做一堆工作来确定在添加和删除联系人时要将联系人粘贴到哪里。你必须有一种情况,而不是两种情况。
  • id est。当我看到用户应该能够做什么时,我超前并简单地使用了列表,但我很快得到了我必须使用数组进行存储的反馈。是的,那句话是一个要求:/

标签: c# arrays string storage


【解决方案1】:

你说得对,数组大小是固定的。但是,您可以使用Array.Resize() 使用所有当前数组数据创建一个指定大小的新数组。因此,对于添加,您需要将大小调整为 1 大并在最后添加新联系人。要删除,您必须使用循环将数组中的所有元素从被删除的元素移回一个位置,然后将其大小调整为小 1。

编辑:一个更简单的删除选项是使用Array.Copy()

Array.Copy(a, deleteIndex + 1, a, deleteIndex, a.Length - (deleteIndex + 1));
Array.Resize(ref a, a.Length - 1);

列表是解决此问题的更好方法,我不知道您为什么要为此使用数组。

【讨论】:

  • 我有点明白,有点不明白。我理解的复制部分:数组“a”的复制将在“deleteIndex”之后直接开始;这应该是用户要删除的联系人的索引。但是如何设置 deleteIndex 以便它实际上是用户想要删除的联系人的[索引]? VS 会告诉我上下文中不存在“deleteIndex”。我在想象一些代码,例如 int deleteIndex = ____; //声明deleteIndex是数组“storagelist”中的索引“item”??调整数组的大小可以顺利进行,正确地复制(因此,删除)让我很受用。
  • @mbksr 是的,您必须将 deleteIndex 设置为您要删除的联系人的实际索引。要查找索引,您可以使用 for 循环,也可以只使用 Array.IndexOf()
【解决方案2】:

无论如何,列表最终都会使用一个数组来存储它。列表的工作方式是初始化一个具有一定存储量的数组,然后如果超过它的容量,它会重新创建一个更大的数组并将元素复制回来。您可以尝试这种方法,除非您只是重新创建列表的功能。

另一种选择是声明一个包含 100,000 个左右元素的任意大数组。一个你知道不会被超过的数字。

对于大小,您可以编写自己的函数来跟踪数组中的联系人数量。

【讨论】:

  • 是否有用于跟踪数组中元素(联系人)数量的内置函数,或者如何完成?再读几个小时并尝试并没有给我任何帮助。 ://
  • 您可以自己跟踪它,这实现起来非常简单,每当您添加一个元素时将计数器设置为 0,您会增加计数器,每当您从数组中删除时,您会减少计数器。要记住的一件事是边界。从空列表中删除不应该给你 -1。
【解决方案3】:

您可以使用通用列表。 List 类在后台使用数组进行存储,但这样做的方式是允许它有效地增长。

查看this link了解更多详细信息,这可能会有所帮助。

【讨论】:

    【解决方案4】:
    var contacts = new[]
    {
        new {  Name = "Foo", Phone = "9999999999" },
        new {  Name = "Bar", Phone = "0000000000"   }
    
    };
    

    您可以创建一个匿名对象数组,然后使用 linq 从数组中删除对象。 您可以创建一个新对象并插入到匿名对象变量中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2017-09-06
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多