2016-12-06 5 views
0

多くのLINQを使用して、Tuple<string, int>のリストの一部の値を設定して一致させる方法があります。Linq 2つのステートメントを1つの大きなステートメント(最適化)に結合する

今私はまだ2つのforeachループが互いに入れ子になっているので、それらを1つの巨大なLINQクエリに結合することは可能でしょう。私は大きな条件として最適化でこれを行うための最良の方法は何だろうと思っています。私はLINQを使用しながら、最後の2 foreachesを最適化したい可能であれば

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

これは私が話している機能です。

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

GetSelectionByIdAsyncメソッドを変更してidsのリストを受け入れることができないので、最初のforeachを取り除くことはできませんか? –

答えて

1

が、私はこれをやっていた...私は何かを試してみたが、私は現在のリストに値を設定するにこだわっています一般的な、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); 
} 

これはあなたのオリジナルの実装は、(私はそれがあるとは思わない)議論のためにアップしているよりも明確であるかどうか、それは一つの方法だろうそれをするの。

注:これはエディタに直接入力されましたが、多少の構文エラーがある可能性があります。

1

あなたが行うことができます何かのように:

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

これは、LINQの遅延実行のために何もしないことがわかります。 –

+1

はい、申し訳ありませんが、ToList()でクエリを実行する必要があります。 – Johnny

関連する問題