无法在数组中搜索最大值

Posted

技术标签:

【中文标题】无法在数组中搜索最大值【英文标题】:Can't search for the max value into an array 【发布时间】:2020-12-14 10:12:17 【问题描述】:

我的问题是我无法使用 linq 搜索数组以查找对象属性并将其设置为 id。

我需要在数组中搜索其他 model.idCliente 并将该值设置为“nextid + 1”的方法,以便将其用作 id 和下一个数组索引。

由于数组为空,程序正确添加了新对象,但是当进入 else if 情况时,我得到一个“a as null”的异常。

这是我的代码(如果 linq 行说“a”为空,我在 else 中得到一个异常):

        //Arrays

    ClienteModel[] MemoryClienti = new ClienteModel[19];
    OrdineModel[] MemoryOrdini = new OrdineModel[19];

    //Aggiungi

    public bool CreateCliente(ClienteModel model)
    
            if (MemoryClienti[0] == null)
             
                int defaultID = 0;
                int defaultIndex = 0;
                model.IDCliente = defaultID;
                MemoryClienti[defaultIndex] = model;
            
            else if (MemoryClienti[0]!=null)
            
                var maxID = MemoryClienti.Max(a => a.IDCliente);
                model.IDCliente = maxID++;
                MemoryClienti[maxID++] = model;
            
            return true;
    

这是点击表单的代码:

        //Aggiungi Cliente
    private void aggiungiClienteButton_Click(object sender, EventArgs e)
    
        clienteModel.Cognome = cognomeTextBox.Text;
        clienteModel.Nome = nomeTextBox.Text;
        clienteModel.Indirizzo = indirizzoTextbox.Text;
        dbMemoryManager.CreateCliente(clienteModel);
        MessageBox.Show("Cliente aggiunto correttamente.");
        cognomeTextBox.Text = String.Empty;
        nomeTextBox.Text = String.Empty;
        indirizzoTextbox.Text = String.Empty;
    

这是ClienteModel 类:

    public class ClienteModel

    public int IDCliente  get; set; 
    public string Cognome  get; set; 
    public string Nome  get; set; 
    public string Indirizzo  get; set; 


【问题讨论】:

当您创建数组时,它会填充类型的默认值 (ClienteModel)。假设这是一个类,数组中的默认值是一个空引用。即使您在数组的零槽中有一个条目,其他槽也是空的。因此,当您运行该代码时,除一个之外的每个插槽都是空的,因此 a.IDCliente 将失败。考虑使用 List<ClienteModel> 而不是数组 - 这里更有意义 有趣,所以(理论上)应该填充整个数组?我应该如何使用列表?我尝试使用 list.add 但每次它都会覆盖前一个对象。例如:[0] a b c,当我输入时添加从文本框和方法创建的另一个对象 (d e f),我有 [0] d e f, [1] d e f。 总是喜欢 List 而不是数组:var yourlist = new List<ClienteModel>(); .... yourlist .Add(someClienteModel); 正如我所说,使用 .add 方法,列表被最新的对象覆盖,所以我有 2 个相同的对象。 【参考方案1】:

下面的代码不能实现你想要做的吗?

ClienteModel[] MemoryClienti = new ClienteModel[19];
OrdineModel[] MemoryOrdini = new OrdineModel[19];
int maxID = 0; /* 0 is not a valid ID. IDs start from 1 */


//Aggiungi
public bool CreateCliente(ClienteModel model)

    if(maxID <= MemoryClienti.Length) 
      MemoryClienti[maxID++] = model;    // copy the reference
      model.IDCliente = maxID;           // update the object's ID
      return true;
     else 
      return false;                      // can't add. array is full
    

如果您还要进行删除,最好按照其他人的建议使用列表。

【讨论】:

似乎可以正常工作,但是当您插入第二个元素时,第一个元素会被第二个元素替换......我不知道为什么,list.add 也会发生。

以上是关于无法在数组中搜索最大值的主要内容,如果未能解决你的问题,请参考以下文章

排序和搜索----数组中的第K个最大元素

搜索范围和返回列标题的公式

C++关于最大值排序法中数组无法赋值的问题

创建由每个子数组的最大值组成的数组无法按预期工作

在有序数组中找到小于 x 的最大值

最大子数组问题