代码:
foreach (var testView in projectDataCandidate.ViewMaps
.Where(vm => !vm.IsNotTestLane)
.Select(this.GenerateTestView))
{
this.SwimLaneViews.Add(testView);
testView.ItemsOrphaned += OnItemsOrphaned;
}
如何以linq代码格式编写上述foreach循环?感谢。
答案 0 :(得分:1)
projectDataCandidate.ViewMaps
.Where(vm => !vm.IsNotTestLane)
.Select(this.GenerateTestView)
.ToList()
.ForEach(testView =>
{
this.SwimLaneViews.Add(testView);
testView.ItemsOrphaned += OnItemsOrphaned;
});
答案 1 :(得分:1)
正如其他人已经指出的那样,你已经在使用LINQ进行查询了,LINQ用于查询而不是命令。
我认为您正在尝试提高代码的可读性。为此,我建议您将查询和命令提取到不同的类成员中:
private IEnumerable<ViewMap> TestViews
{
get
{
return projectDataCandidate.ViewMaps
.Where(vm => !vm.IsNotTestLane)
.Select(this.GenerateTestView);
}
}
private void Process(ViewMap testView)
{
this.SwimLaneViews.Add(testView);
testView.ItemsOrphaned += OnItemsOrphaned;
}
然后您的逻辑变为以下内容,这很容易阅读:
private void ProcessTestViews()
{
foreach (var testView in TestViews)
Process(testView);
}
如果你仍然不喜欢foreach
的外观,你可以这样做,我认为这更容易阅读:
private void ProcessTestViews()
{
TestViews.ToList().ForEach(Process);
}
ToList
如果您不想将结果转换为List
,因为它不是真正需要的,您可以编写一个扩展方法为ForEach
提供IEnumerable<T>
:
public static class IEnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> elements, Action<T> action)
{
foreach (var element in elements)
action(element);
}
}
这使您可以进一步简化方法:
private void ProcessTestViews()
{
TestViews.ForEach(Process);
}
答案 2 :(得分:0)
试
projectDataCandidate.ViewMaps.Where(vm => !vm.IsNotTestLane)
.Select(this.GenerateTestView).ForEach(xx=>xx.Your logic)
答案 3 :(得分:-1)
我能看到的唯一方法是使用ToList强制执行,然后使用ForEach函数。
var objects = projectDataCandidate.ViewMaps
.Where(vm => !vm.IsNotTestLane)
.Select(this.GenerateTestView)
.ToList();
objects.ForEach(a => SwimLaneViews.Add(a));
objects.ForEach(a => a.ItemsOrphaned += OnItemsOrphaned);