如何将地址列表改造为数组队列?C#课程设计代码问题求助
两个问题的核心原因解释
问题1:Client类的Operation数组类型问题
在C#语法规则中,类(class)属于引用类型,你当前声明的Operation是类,因此private Operation[] operations天然就是引用数组,每个元素存储的是堆中Operation对象的内存地址,而非独立的对象副本。指导老师要求的「Operation类的对象数组」,本质是要数组中存储独立的Operation实例副本,避免外部修改直接影响类内部的私有数据。
问题2:Bank类的存储结构问题
你当前使用的DoublyLinkedList<Client>是自定义的链式存储双向循环链表,属于非连续存储结构,而指导老师要求的「数组队列」是基于连续数组实现的线性存储结构,和你当前的实现方案不符,不符合作业要求的「Client类对象的循环双向数组」的设计目标。
具体修改方案
第一步:修改Operation实现(支持对象数组存储)
可以直接将Operation改为值类型结构体,此时数组中存储的就是独立的对象实例:
// Operation 改 struct using System; namespace DepositLibrary { // 操作结构体(值类型) public struct Operation { public DateTime date; public decimal deposit; public Operation(DateTime dateIn, decimal depositIn) { date = dateIn; deposit = depositIn; } public DateTime GetDateTime { get => date; } public decimal GetDeposit { get => deposit; } } }
第二步:修改Client类,补充操作添加逻辑
你当前的Operation数组初始化是空数组,没有新增操作的入口,补充对应方法:
// 修改后的Client类 using System; using System.Linq; namespace DepositLibrary { public class Client { public string surname; public decimal currentDeposit; // 现在Operation是struct,数组就是对象数组 private Operation[] operations; public Client(string surnameIn) { surname = surnameIn; operations = Array.Empty<Operation>(); } public string GetSurname { get => surname; } // 对外返回副本,避免外部修改内部数据 public Operation[] Operations { get => operations.ToArray(); } public decimal GetDeposit { get => currentDeposit; } // 补充添加操作的方法 public void AddOperation(Operation op) { Array.Resize(ref operations, operations.Length + 1); operations[^1] = op; currentDeposit += op.deposit; } } }
第三步:修改Bank类,替换为数组队列
使用.NET内置的数组实现队列Queue<T>,也可以自己手动实现循环数组:
// 修改后的Bank类 using System; using System.Collections.Generic; namespace DepositLibrary { public class Bank { private string nameBank; // 替换为数组实现的队列 private Queue<Client> arrayClient; public Bank(string _nameBank) { nameBank = _nameBank; arrayClient = new Queue<Client>(); } public string GetBankName { get => nameBank; } public Queue<Client> GetListClients { get => arrayClient; } // 补充客户操作方法 public void AddClient(Client client) => arrayClient.Enqueue(client); public Client RemoveClient() => arrayClient.Dequeue(); } }
其他优化建议
- 如果需要保留双向遍历的能力,可以自己基于数组实现循环双向数组,通过头指针、尾指针的偏移来实现循环逻辑,替代链式链表
- 原自定义
DoublyLinkedList中的非泛型枚举方法直接抛出NotImplementedException,会导致遍历报错,如果需要保留链表实现需要修复该方法逻辑
内容的提问来源于stack exchange,提问作者user15352710
相关产品推荐
相关产品推荐

