[英]Linq IGrouping, ILookup or IDIctionary divide and map into new IEnumerable
我想将数据库模型映射到视图模型,同时将未映射的属性分为真假查找:
映射的属性将类似于
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,IEnumerable <SelectListItem >>,而是<bool,selectListItem>
谢谢你的帮助。
我怀疑您实际上是希望您的财产属于此类
ILookup<bool, SelectListItem>
不要忘记ILookup<TKey, TElement>
被声明为:
public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>
(还实现了非通用的IEnumerable
,但现在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>
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.