如何将以下foreach循环转换为linq代码格式?

时间:2014-02-18 07:02:51

标签: c# .net linq c#-4.0 foreach

代码:

foreach (var testView in projectDataCandidate.ViewMaps
                                             .Where(vm => !vm.IsNotTestLane)
                                             .Select(this.GenerateTestView))
{
      this.SwimLaneViews.Add(testView);
      testView.ItemsOrphaned += OnItemsOrphaned;
}

如何以linq代码格式编写上述foreach循环?感谢。

4 个答案:

答案 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);