簡體   English   中英

Linq將兩個語句合並為一個大語句(優化)

[英]Linq Combine two statements into one big statement (optimization)

我有一種使用大量LINQ設置和匹配Tuple<string, int>列表中的某些值的方法。

現在,我仍然停留在彼此嵌套的兩個foreach循環中,我認為可以將它們組合成一個巨大的LINQ查詢。 我想知道最優化的最佳條件是什么?

這是我正在談論的功能:

private async void AddLocalChangesFromPendingOperations()
{
    var pendingOperations = await this.operationsStorage.GetOperationsAsync();
    var list = pendingOperations.
        SelectMany(pendingOperation =>
                           pendingOperation.Settings, (pendingOperation, setting) =>
                           new { pendingOperation, setting })
        .Where(a => a.setting.Key == "selection")
        .Select(a => new Tuple<string, int>(
                                             a.pendingOperation.DefinitionId,
                                             Convert.ToInt32(a.setting.Value.ValueObject)))
        .ToList();

    foreach (var pendingChange in list)
    {
        var selection = await this.selectionsStorage.GetSelectionByIdAsync(pendingChange.Item2);
        foreach (var selectionsViewModel in this.SelectionsList.Where(a => a.Name == selection.Name))
        {
            if (pendingChange.Item1 == "selection-add-animals")
            {
                selectionsViewModel.IsActive = true;
            }
            else if (pendingChange.Item1 == "selection-remove-animals")
            {
                selectionsViewModel.IsActive = false;
            }
        }
    }
}

如果可能的話,我想在使用linq時優化最后兩個foreach。 我已經嘗試了一些方法,但是我仍然無法在當前列表中設置值...

我正在這樣做:

this.SelectionsList = this
    .SelectionsList
    .Where(a => a.Name == selection.Name)
    .SingleOrDefault(
        a => pendingChange.Item1 == "selection-add-animals" ? a.IsActive = true : a.IsActive = false
    );

您可以執行以下操作:

this.SelectionsList = this.SelectionsList
    .Where(a => a.Name == selection.Name)
    .Select(a => 
    {
        a.IsActive = a.Name == selection.Name ? true:false;
        return a;
    }).ToList();

通常,LINQ用於查詢項目(語言集成Query )。 但是,您可以進行查詢,然后在末尾進行foreach:

private async void AddLocalChangesFromPendingOperations()
{
    var pendingOperations = await this.operationsStorage.GetOperationsAsync();

    (await Task.WhenAll(pendingOperations
        .SelectMany(pendingOperation =>
                           pendingOperation.Settings, (pendingOperation, setting) =>
                           new { pendingOperation, setting })
        .Where(a => a.setting.Key == "selection")
        .Select(a => Tuple.Create(a.pendingOperation.DefinitionId, Convert.ToInt32(a.setting.Value.ValueObject)))
        .Select(async pendingChange => Tuple.Create(await this.selectionsStorage.GetSelectionByIdAsync(pendingChange.Item2)), pendingChange))
        .SelectMany(tuple => this.SelectionsList.Where(a => a.Name == tuple.Item1.Name)
                                                .Select(selectionsViewModel => Tuple.Create(selectionsViewModel, tuple.Item2))
        .Select(tuple => Tuple.Create(tuple.Item1, tuple.Item2.Item1 == "selection-add-animals"))
        .ToList()
        .ForEach(tuple => tuple.Item1.IsActive = tuple.Item2);
}

是否比您的原始實現更清晰尚待討論(我認為不是),但這將是實現這一目標的一種方法。

注意:這是直接在編輯器中鍵入的,可能存在一些較小的語法錯誤。

暫無
暫無

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

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