C# 无法理解ToLookup linq扩展方法的功能

C# 无法理解ToLookup linq扩展方法的功能,c#,C#,我试图在代码中找出ToLookup方法的功能。它以某种方式使用分组来返回列表。有人能告诉我这是如何工作的,或者只是指导我正确的方向: .ToLookup( c => new { c.CoverageType.Code, c.CoverageType.Mnemonic, c.CoverageType.Description, c.CoverageType.CoverageLevel, c.CoverageType.

我试图在代码中找出ToLookup方法的功能。它以某种方式使用分组来返回列表。有人能告诉我这是如何工作的,或者只是指导我正确的方向:

.ToLookup(
  c => new 
  {
      c.CoverageType.Code, 
      c.CoverageType.Mnemonic, 
      c.CoverageType.Description, 
      c.CoverageType.CoverageLevel, 
      c.CoverageType.CoveragePosition
  })
.Select(
  t => new CoverageOption
  {
    CoverageType =
      new CoverageType
      {
          Code = t.Key.Code, 
          Mnemonic = t.Key.Mnemonic, 
          Description = t.Key.Description, 
          CoverageLevel = t.Key.CoverageLevel, 
          CoveragePosition = t.Key.CoveragePosition
      },
    Limits =
      (from Coverage c in t select c.Limit).GroupBy(l => l.Code)
        .Select(gr => gr.First()), 
    Deductibles =
      (from Coverage c in t select c.Deductible).GroupBy(d => d.Code)
        .Select(gr => gr.First())
})
.OrderBy(t => t.CoverageType.CoveragePosition);

如文件所述:

ToLookup(IEnumerable,Func)方法返回一个查找,一个一对多字典,将键映射到值集合。查找不同于字典,字典执行键到单个值的一对一映射

因此,它与GroupBy类似,但也有一些不同之处。

源项(我假设其类型为
覆盖范围
)按以下键进行分组:

new 
{
  c.CoverageType.Code, 
  c.CoverageType.Mnemonic, 
  c.CoverageType.Description, 
  c.CoverageType.CoverageLevel, 
  c.CoverageType.CoveragePosition
}
为输入序列中的每个不同键创建一个
CoverageOption
。请注意,一个键可能与多个
覆盖范围
项目关联,对于每个键和一个或多个关联的
覆盖范围
项目,计算
覆盖范围操作
的以下属性:

  • CoverageType
    属性是从键计算的

  • Limits
    属性是通过获取相关
    Coverage
    项的所有
    Limit
    值以及每个不同的
    Coverage.Limit.code
    选择第一个
    Limit
    实例来计算的。这是一系列的
    Limit
    对象,每个对象都有一个不同的
    code

  • 免赔额
    属性是通过获取相关
    覆盖范围
    项目的所有
    免赔额
    值以及每个不同的
    覆盖范围.免赔额.code
    选择第一个
    免赔额
    实例来计算的。所以这是一系列的
    免赔额
    对象,每个对象都有一个不同的
    代码


您不明白哪一点?使用
ToLookup
创建一对多字典(lambda函数是键选择器函数)。您可以在稍后的选择中看到这一点,您正在使用
t.Key…
在选择中哇,这个答案太棒了。我正在经历这一切,我相信这将扫除乌云!!谢谢你,伙计!因此,这个ToLookup的关键是一个元组,最初我将其更改为匿名类型,如上面的代码所示。如果我所做的是对的,你能对此发表评论吗?我删除了元组,因为我必须使用items1、2等来访问键,这使得代码不可读。@Charu:您应该能够使用
CoverageType
而不是使用匿名类型作为键。但是,要做到这一点,您需要覆盖
CoverageType.Equals
CoverageType.GetHashCode
,以确保具有相同属性值的不同实例被视为相等。