即使经过数小时的尝试,我似乎无法解决的任务。
基本上,我有一个电话簿,它接收来自用户的输入:名称和号码(两种字符串类型),后者成为联系人。 我应该将联系人存储在数组中,用户应该能够通过创建和删除方法从数组中添加和删除数据(Contact)。
我创建了一个自己的存储库类来处理数据(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;
}
}
我正在寻找的是,如何做到这一点,具有添加和删除联系人的这两项功能,而是将数据存储在数组中。
由于数组(据我所知)必须具有固定的预定义大小,因此我不知道如何以与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);
答案 0 :(得分:2)
你是对的,数组大小是固定的。但是,您可以使用Array.Resize()创建具有所有当前数组数据的指定大小的新数组。因此,对于添加,您将调整为大1并在最后添加新联系人。为了删除你将不得不使用一个循环来移动数组中的所有元素超过被移除的一个元素,然后将其调整为1更小。
编辑:一个更简单的删除选项是使用Array.Copy():
Array.Copy(a, deleteIndex + 1, a, deleteIndex, a.Length - (deleteIndex + 1));
Array.Resize(ref a, a.Length - 1);
列表是解决这个问题的一个更好的解决方案,我不知道为什么你会想要为此使用数组。
答案 1 :(得分:0)
无论如何,List最终都会使用数组进行存储。列表的工作方式是初始化具有一定存储量的数组,然后如果超出容量,则重新创建具有更大大小的数组并将元素复制回来。您可以尝试这种方法,除非您只是重新创建列表的内容。
另一个选项只是声明一个任意大的100,000个元素数组。你知道的数字不会超过。
对于大小,您可以编写自己的函数来跟踪数组中的联系人数量。
答案 2 :(得分:0)
您可以使用通用列表。在引擎盖下,List类使用一个数组进行存储,但这种方式允许它有效地增长。
请查看this link了解更多详情,这可能会有所帮助。
答案 3 :(得分:0)
var contacts = new[]
{
new { Name = "Foo", Phone = "9999999999" },
new { Name = "Bar", Phone = "0000000000" }
};
您可以创建一个匿名对象数组,然后使用linq从数组中删除对象。 您可以创建一个新对象并插入到匿名对象变量中。