【问题标题】:Convert to LINQ of a foreach iteration gives compilation error in VS Asp.Net 2019 .Net 4.8转换为 foreach 迭代的 LINQ 在 VS Asp.Net 2019 .Net 4.8 中产生编译错误
【发布时间】:2021-02-25 08:43:28
【问题描述】:

我有一个分层对象(Result->userDataProfilePermissions->dataPermissions->Values->dataObjectValue)

我需要区分 dataObjectValue 这是一个字符串。

我已经编写了以下循环,它应该可以正常工作。

var businesses = new List<BusinessRbac>();
foreach (var udpp in result.userDataProfilePermissions)
{
    foreach (var dp in udpp.dataPermissions)
    {
        foreach (var v in dp.values)
        {
            if (!businesses.Any(x => x.BusinessName == v.dataObjectValue))
                businesses.Add(new BusinessRbac() { BusinessName = v.dataObjectValue, Regions = new List<RegionRbac>() });
        }
    }
}

当我将其转换为 LINQ 时,我得到以下代码

var businesses = (from udpp in result.userDataProfilePermissions
                  from dp in udpp.dataPermissions
                  from v in dp.values
                  where !businesses.Any(x => x.BusinessName == v.dataObjectValue)
                  select new BusinessRbac() { BusinessName = v.dataObjectValue, Regions = new List<RegionRbac>() }).ToList();

编译错误:

CS0841: Cannot user local variable 'businesses' before it is declared.

【问题讨论】:

  • 看来你其实只是想要一个 groupby

标签: c# .net visual-studio linq


【解决方案1】:

您的嵌套循环解决方案使businesses 中的新插入可用于在以下迭代期间进行唯一性检查,而您的 LINQ 解决方案无法检查businesses,因为尚未分配查询结果。

您可以通过其他方式执行唯一性检查来解决此问题 - 例如,通过对 dataObjectValue 进行分组,然后选择该组的第一个成员:

var businesses = result.userDataProfilePermissions
    .SelectMany(udpp => udpp.dataPermissions.SelectMany(dp => dp.values))
    .GroupBy(v => v.dataObjectValue)
    .Select(g => g.First())
    .Select(v => new BusinessRbac() {
        BusinessName = v.dataObjectValue,
        Regions = new List<RegionRbac>()
    }).ToList();

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2012-01-03
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多