簡體   English   中英

從列表中刪除項目 <T> 如果嵌套集合包含指定值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM