我通过一个不那么优雅的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"));
}
思考?
答案 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"));
它将删除所有没有任何已解析或已关闭属性的项目。