【发布时间】:2016-12-06 11:47:57
【问题描述】:
我有一个方法使用大量 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 时优化最后两个 foreaches。我已经尝试了一些东西,但我一直坚持在当前列表中设置值...
我正在这样做:
this.SelectionsList = this
.SelectionsList
.Where(a => a.Name == selection.Name)
.SingleOrDefault(
a => pendingChange.Item1 == "selection-add-animals" ? a.IsActive = true : a.IsActive = false
);
【问题讨论】:
-
你不能改变GetSelectionByIdAsync方法来接受一个id列表,这样你就可以摆脱第一个foreach了吗?