不能复制对象到新的数组中
本文关键字:数组 复制 对象 不能 | 更新日期: 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)
表达式…