Linq IGrouping,ILookup或IDIctionary划分并映射到新的IEnumerable

时间:2013-05-28 05:17:34

标签: c# linq

我想将数据库模型映射到视图模型,同时在未映射的属性上划分真正的错误查找:

映射的属性类似于

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

但当然我没有映射到&lt; bool,IEnumerable&lt; SelectListItem&gt;&gt;而是&lt; bool,selectListItem&gt;

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我怀疑你实际上希望你的财产属于

类型
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>>,但我仍然认为您需要{{1 }}。)