无法将对象复制到新数组中

时间:2015-08-06 08:21:32

标签: c# arrays

我有一个数组,里面填充了我自己声明的类型的对象(称为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]中的数据。相反,它们只是“无效”。

关于什么可能出错或如何解决它的任何想法?

4 个答案:

答案 0 :(得分:2)

错误就在这一行:

serviceUnitsFiltered[i] = serviceUnits[i];

serviceUnitsFiltered的索引不应该是i,而是其他内容。可能是每次向serviceUnitsFiltered添加内容时递增的新变量,如:

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

另外考虑使用LINQ,它更短(虽然稍微慢一些):

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

答案 1 :(得分:1)

使用LINQ可以轻松完成:

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

答案 2 :(得分:1)

为什么不做......

ServiceUnit[] serviceUnits = ProductConfiguration.ServiceGuide.GetServiceUnits();

ServiceUnitType serviceUnitType = ProductConfiguration.ServiceGuide.GetServiceUnitType(guid);

serviceUnitsFiltered = serviceUnits.Where(unit=>unit.ServiceUnitTypeAttributes[0].ServiceUnitType.Id == serviceUnitType.Id).ToList();

答案 3 :(得分:0)

您可以使用List<T>代替使用数组:

/* 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()方法将其转换为

P.S。 LINQ是单线解决方案,但它比简单的for循环慢,只有一个if(condition)表达式......