簡體   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