C# 从对象列表中删除特定项
我有一份物品清单:C# 从对象列表中删除特定项,c#,.net,linq,C#,.net,Linq,我有一份物品清单: 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 = "5
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"}
}
但它不能正常工作,因为sID是IEnumarable类型
因此,我的问题是如何从sId列表中存在sensorsId属性的desc列表中删除项目?您需要使用
Any
,如下所示:
desc.RemoveAll(obj => sId.Any(x=> x== obj.sensorId ));
正如方法名称所示,它将检查
sId
中的任何项是否与desc
中的项与sensorId
中的项匹配,它将从列表中删除这些项
您需要对其使用any
,如下所示:
desc.RemoveAll(obj => sId.Any(x=> x== obj.sensorId ));
正如方法名称所示,它将检查
sId
中的任何项是否与desc
中针对sensorId
的项相匹配,它将从列表中删除这些项您可以使用.Contains()
LINQ方法检查集合是否包含项:
desc.RemoveAll(obj => sId.Contains(obj.sensorId));
但是,这将导致可枚举的sId
的多次枚举。在这种情况下这不是问题,因为在这种特殊情况下,此可枚举项是一个数组
阅读有关“可能的多重枚举”的更多信息:
-
-
我建议将其转换为集合,以确保只枚举一次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));
List desc=新列表{
新的SDesc{sensorId=“1234”,address=“Adams22”},
新的SDesc{sensorId=“5555”,address=“Hourton34”},
新的SDesc{sensorId=“4444”,address=“SaintsRoad55”},
新的SDesc{sensorId=“1258”,address=“BerryAve58”},
新的SDesc{sensorId=“52486”,address=“SaintsRoad2”},
新SDesc{sensorId=“12361”,address=“TomassonRoad”}
};
IEnumarable sId={“4444”、“52486”、“12361”};
var sIdsSet=新哈希集(sId);
desc.RemoveAll(obj=>sIdsSet.Contains(obj.sensorId));
您可以使用.Contains()
LINQ方法检查集合是否包含项:
desc.RemoveAll(obj => sId.Contains(obj.sensorId));
但是,这将导致可枚举的sId
的多次枚举。在这种情况下这不是问题,因为在这种特殊情况下,此可枚举项是一个数组
阅读有关“可能的多重枚举”的更多信息:
-
-
我建议将其转换为集合,以确保只枚举一次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));
List desc=新列表{
新的SDesc{sensorId=“1234”,address=“Adams22”},
新的SDesc{sensorId=“5555”,address=“Hourton34”},
新的SDesc{sensorId=“4444”,address=“SaintsRoad55”},
新的SDesc{sensorId=“1258”,address=“BerryAve58”},
新的SDesc{sensorId=“52486”,address=“SaintsRoad2”},
新SDesc{sensorId=“12361”,address=“TomassonRoad”}
};
IEnumarable sId={“4444”、“52486”、“12361”};
var sIdsSet=新哈希集(sId);
desc.RemoveAll(obj=>sIdsSet.Contains(obj.sensorId));
基本上与、和相同的问题。基本上与、和相同的问题。如果将其转换为任何内容,我会说它应该是HashSet
而不是数组。@Yeldar Kurmangaliyev:您不应该从行中删除否定符(!):desc.RemoveAll(x=>!sIdsArray.Contains(x.sensorId))代码>Michael需要sId中没有的所有东西List@Evk非常感谢。我错过了性能改进的可能性:)只是更新了我的答案。如果将它转换成任何东西,我会说它应该是HashSet
而不是数组。@Yeldar Kurmangaliyev:您不应该从行中删除否定符(!):desc.RemoveAll(x=>!sIdsArray.Contains(x.sensorId))代码>Michael需要sId中没有的所有东西List@Evk非常感谢。我错过了性能改进的可能性:)刚刚更新了我的答案。谢谢你的帖子。如果我描述的是IEnumerable类型而不是List,该怎么办?从中删除项目的方法是什么?在这种情况下,你需要使用Where()
过滤结果并存储对新的IEnumerable
的引用,例如:var result=desc.Where(obj=>sId.Any(x=>x==obj.sensorId))代码>谢谢你的帖子。如果I desc是IEnumerable类型而不是List,该怎么办?从中删除项目的方法是什么?在这种情况下,你需要使用Where()
过滤结果并存储对新IEnumerable
的引用,比如:var result=desc.Where(obj=>sId.Any(x=>x==obj.sensorId))代码>