我有一个数组,里面填充了我自己声明的类型的对象(称为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]中的数据。相反,它们只是“无效”。
关于什么可能出错或如何解决它的任何想法?
答案 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)
表达式......