如果嵌套集合包含指定值,则从List <t>中删除项目

时间:2015-09-16 01:14:53

标签: c#

我通过一个不那么优雅的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"));
}

思考?

2 个答案:

答案 0 :(得分:1)

免责声明:不是一个很酷的孩子。

如果使用现有谓词的反转.Where(),那该怎么办:

authorsList = authorsList.Where(x => x.ExtendedAttributes.ElementAt(y => y.Value == "Resolved" || y.Value == "Closed")).ToList();

编辑:添加.ToList()因为我总是忘记它,感谢@KyleJV

答案 1 :(得分:0)

您似乎在努力使用哪种功能。您应该使用Any()代替ElementAt(),您的lambda 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"));

它将删除所有没有任何已解析或已关闭属性的项目。