分组,查找或字典划分和映射到新的IEnumerable

本文关键字:映射 IEnumerable 划分 查找 字典 分组 | 更新日期: 2023-09-27 18:15:43

我想将一个数据库模型映射到一个视图模型,同时在一个属性上划分一个真假查找,不映射:

映射属性类似于

public IDictionary<bool,IEnumerable<SelectListItem>> 
   NoConsentAttemptReasons { get; set; }

这样我就可以遍历

foreach (SelectListItem item in NoConsentAttemptReasons[true])

,但我不确定Linq实现这一点。尝试了多种排列,包括:

model.NoConsentAttemptReasons = ScreenService
       .GetNoConsentReasons()
       .ToLookup(r=>r.Unaware, r => new SelectListItem
{
   Text = r.Description,
   Selected = model.NoConsentAttemptId == r.Id,
   Value = r.Id.ToString()
});

当然我没有映射到<bool,>>而是<bool,选择>

感谢您的帮助

分组,查找或字典划分和映射到新的IEnumerable

我怀疑你实际上希望你的属性类型为

ILookup<bool, SelectListItem>

不要忘记ILookup<TKey, TElement>被声明为:

public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>

(也实现了非泛型IEnumerable,但现在我们忽略它。)

所以查找的任何元素都已经实现了IEnumerable<TElement> -你几乎肯定不需要在它周围再加一层IEnumerable<>

例如,如果声明属性为:

public ILookup<bool, SelectListItem> NoConsentAttemptReasons { get; set; }

那么你可以写:

foreach (SelectListItem item in NoConsentAttemptReasons[true])
{
    ...
}

这个没有实现IDictionary<,>,但实际上这样更简单——因为查找将返回一个未知键的空序列,而不是失败。

(在我开始回答的问题版本中,属性的类型是ILookup<bool,IEnumerable<SelectListItem>>。我不知道你为什么把它改成IDictionary<bool,IEnumerable<SelectListItem>>,但我仍然认为你想要ILookup<bool, SelectListItem>。)