[英]Remove specific items from list of objects
我有对象列表:
public class SDesc
{
public string sensorId { get; set; }
public string address { get; set; }
}
List<SDesc> desc = new List<SDesc>
{
new SDesc {sensorId = "1234", address = "Adams22"},
new SDesc {sensorId = "5555", address = "Hourton34"},
new SDesc {sensorId = "4444", address = "SaintsRoad55"},
new SDesc {sensorId = "1258", address = "BerryAve58"},
new SDesc {sensorId = "52486", address = "SaintsRoad2"},
new SDesc {sensorId = "12361", address = "TomassonRoad"}
}
而且我还有IEnumarable的字符串:
IEnumarable<string> sId = {"4444","52486","12361"};
从desc列表中,我需要删除sId列表中sensorId属性存在的记录。
例如,对于上述情况,我想要得到的结果是:
List<SDesc> desc = new List<SDesc>
{
new SDesc {sensorId = "1234", address = "Adams22"},
new SDesc {sensorId = "5555", address = "Hourton34"},
new SDesc {sensorId = "1258", address = "BerryAve58"},
}
这是我尝试的:
desc.RemoveAll(obj => obj.sensorId == sId);
但这不能正常工作,因为sID是IEnumarable类型。
所以我的问题是如何从sId列表中存在sensorId属性的desc列表中删除项目?
您需要使用Any
,例如:
desc.RemoveAll(obj => sId.Any(x=> x== obj.sensorId ));
正如方法名称所暗示的那样,它将针对sensorId
检查sId
中的任何项目与desc
中的项目sId
匹配,它将从List<T>
删除这些项目。
您可以使用.Contains()
LINQ方法来检查集合中是否包含项:
desc.RemoveAll(obj => sId.Contains(obj.sensorId));
但是,这将导致可枚举sId
多个枚举。 在这种情况下这不是问题,因为在这种特殊情况下,此可枚举是一个数组。
阅读有关“可能的多重枚举”的更多信息:
- 处理可能的IEnumerable多个枚举的警告
-Resharper的示例代码,用于解释“ IEnumerable的可能多重枚举”
我建议将其转换为集合,以确保只枚举IEnumerable
。
正如Evk在评论中建议的那样,最好使用HashSet
以便.Contains
在O(1)
时间执行:
List<SDesc> desc = new List<SDesc> {
new SDesc {sensorId = "1234", address = "Adams22"},
new SDesc {sensorId = "5555", address = "Hourton34"},
new SDesc {sensorId = "4444", address = "SaintsRoad55"},
new SDesc {sensorId = "1258", address = "BerryAve58"},
new SDesc {sensorId = "52486", address = "SaintsRoad2"},
new SDesc {sensorId = "12361", address = "TomassonRoad"}
};
IEnumarable<string> sId = {"4444","52486","12361"};
var sIdsSet = new HashSet(sId);
desc.RemoveAll(obj => sIdsSet.Contains(obj.sensorId));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.