[英]Remove item from List<T> if a nested collection contains specified value
通過不太優雅的foreach循環,我基本上已經達到了想要的效果。 我在這里發布的原因有兩個。 一種是,如果有人可以向我展示一種“酷”的孩子方式來做到這一點,或者對現實發表評論,因為有時數組上的foreach更快,然后將其轉換為List,然后使用Lambda表達式。
因此,我正在使用Artifact類上的ExtendedAttributes屬性。 https://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.artifact(v=vs.110).aspx
//I get my array of artifacts just fine
LinkFilter linkFilter = new LinkFilter();
linkFilter.FilterType = FilterType.ToolType;
linkFilter.FilterValues = new String[1] { ToolNames.WorkItemTracking }; //only work itms
Artifact[] artifacts = linkingService.GetReferencingArtifacts(changesetArtifactUris.ToArray(), new LinkFilter[1] { linkFilter });
//now I want to keep work items that are resolved or closed
//so I cast put into a List<T> just to then use Lambda in a for each loop
//THIS SECTION PSEUDO CODE FOR BREVITY yes I know you can't modify object you are looping over
var lst_artifacts = new List<Artifact>(artifacts);
foreach (var item in lst_artifacts)
{
lst_artifacts.RemoveAt(item.ExtendedAttributes.ElementAt(y => y.Value != "Resolved" || y.Value != "Closed"));
}
思考?
免責聲明 :這不是一個好孩子。
將.Where()
與現有謂詞取反怎么辦:
authorsList = authorsList.Where(x => x.ExtendedAttributes.ElementAt(y => y.Value == "Resolved" || y.Value == "Closed")).ToList();
編輯 :添加了.ToList()
因為我一直忘了它,這要感謝@KyleJV
看來您在使用哪個功能上很掙扎。 您應該使用Any()
而不是ElementAt()
,您的lambda y => y.Value != "Resolved" || y.Value != "Closed"
y => y.Value != "Resolved" || y.Value != "Closed"
不是數字,您不能將其傳遞給ElementAt()
。 您可以使用ElementAt(1)
, ElementAt(2)
來獲取特定索引處的元素,但不能使用ElementAt(true)
。
lst_artifacts.RemoveAll(item => !item.ExtendedAttributes.Any(y => y.Value == "Resolved" || y.Value == "Closed"));
它將刪除所有沒有任何解析或關閉屬性的項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.