不能复制对象到新的数组中

本文关键字:数组 复制 对象 不能 | 更新日期: 2023-09-27 18:06:33

我有一个数组,其中充满了我自己声明的类型(称为ServiceUnit)的对象。现在我想从这个数组中过滤掉一些对象,我要做的是实现这一点,我有一个正确大小的新数组,并尝试将对象复制到新数组中。

ServiceUnit[] serviceUnits = ProductConfiguration.ServiceGuide.GetServiceUnits();
ServiceUnitType serviceUnitType = ProductConfiguration.ServiceGuide.GetServiceUnitType(guid);
int size = 0;
/* COUNT THE NUMBER OF OBJECTS ADHERING TO MY CRITERIA */
foreach (ServiceUnit unit in serviceUnits)
{
    if (unit.ServiceUnitTypeAttributes[0].ServiceUnitType.Id == serviceUnitType.Id)
    {
        size++;
    }
}
/* ARRAY TO STORE FILTERED OBJECTS BASED ON A CRITERIA */
ServiceUnit[] serviceUnitsFiltered = new ServiceUnit[size];
/* LOOP AND CHECK IF ADHERING TO CRITERIA, THEN COPY TO NEW ARRAY */
for(int i=0; i<serviceUnits.Length; i++){
    if(serviceUnits[i].ServiceUnitTypeAttributes[0].ServiceUnitType == serviceUnitType){
        serviceUnitsFiltered[i] = serviceUnits[i];
    }
}

我遇到的问题是,新数组中确实有适量的对象,但它们没有填充来自serviceUnits[I]的数据。相反,它们只是被"null "。

有什么想法可能是错误的或如何解决它?

不能复制对象到新的数组中

bug在这一行:

serviceUnitsFiltered[i] = serviceUnits[i];

指向serviceUnitsFiltered的索引不应该是i,而应该是其他的东西。可能是一个新变量,每次您向serviceUnitsFiltered添加一些东西时都会增加,例如:

serviceUnitsFiltered[j++] = serviceUnits[i];

也可以考虑使用LINQ,它更短(尽管有点慢):

serviceUnitsFiltered = serviceUnits.Where(x=>x.ServiceUnitTypeAttributes[0].ServiceUnitType == serviceUnitType).ToArray();

为什么不直接…

ServiceUnit[] serviceUnits = ProductConfiguration.ServiceGuide.GetServiceUnits();
ServiceUnitType serviceUnitType = ProductConfiguration.ServiceGuide.GetServiceUnitType(guid);
serviceUnitsFiltered = serviceUnits.Where(unit=>unit.ServiceUnitTypeAttributes[0].ServiceUnitType.Id == serviceUnitType.Id).ToList();

使用LINQ:

可以更容易地做到这一点。
serviceUnitsFiltered = serviceUnits.Where(su => su.ServiceUnitTypeAttributes[0].ServiceUnitType == serviceUnitType)
                                   .ToArray();

您可以使用List<T>而不是使用array:

/* LOOP AND CHECK IF ADHERING TO CRITERIA, THEN COPY TO NEW ARRAY */
List<ServiceUnit> serviceUnitsFiltered= new List<ServiceUnit>();
for(int i = 0; i < serviceUnits.Length; i++) 
    if(serviceUnits[i].ServiceUnitTypeAttributes[0].ServiceUnitType == serviceUnitType) 
       serviceUnitsFiltered.Add(serviceUnits[i]);

或者,如果你严格需要ServiceUnit元素的数组,你可以使用List<T>.ToArray()方法转换它

注:LINQ是一行解决方案,但它比简单的for循环慢,只有一个if(condition)表达式…