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))