繁体   English   中英

从对象列表中删除特定项目

[英]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以便.ContainsO(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM