You need to enable JavaScript to run this app. 如何将地址列表改造为数组队列?C#课程设计代码问题求助
优惠活动
大模型
产品
解决方案
定价
更多

如何将地址列表改造为数组队列?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 02:15:10