簡體   English   中英

如何將以下foreach循環轉換為linq代碼格式?

[英]How to convert the following foreach loop to linq code format?

碼:

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

如何以linq代碼格式編寫上述foreach循環? 謝謝。

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

正如其他人已經指出的那樣,您已經在使用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因為它不是真正需要的,則可以編寫擴展方法來為IEnumerable<T>提供ForEach

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);
}

嘗試

projectDataCandidate.ViewMaps.Where(vm => !vm.IsNotTestLane)
                                             .Select(this.GenerateTestView).ForEach(xx=>xx.Your logic)

我可以看到的唯一方法是使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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