[英]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.