如何使用 linq 映射两个列表

Any*_*are 5 c# linq asp.net collections list

如果我有这样的日期列表:

List<DateTime>  {5-10-2014,6-10-2014,7-10-2014}
Run Code Online (Sandbox Code Playgroud)

我有这样的会话列表:

List<int>  {1,2,3,4,5,6}
Run Code Online (Sandbox Code Playgroud)

考虑到每个日期按顺序有两个会话,如何将会话映射到日期(使用 linq)。


我想要这样的结果:

5-10-2014    1
5-10-2014    2
6-10-2014    3
6-10-2014    4
7-10-2014    5
7-10-2014    6
Run Code Online (Sandbox Code Playgroud)

brz*_*brz 5

这是一个简单的解决方案:

dates是一个列表DateTime,sessions 是一个列表int

var result = sessions.Select((session,i) => 
                      new{Session = session, Date = dates[i/2]});
Run Code Online (Sandbox Code Playgroud)

结果包含一个匿名对象的 IEnumerable ,您可以像这样访问它的属性:

foreach(var sessionDate in result)
{
   var date = sessionDate.Date;
   var session = sessionDate.Session.
}
Run Code Online (Sandbox Code Playgroud)


And*_*ker 5

这是您可以使用的一种方法GroupJoin

var groupedDates = dates
    .Select((date, index) => new { Date = date, Index = index })
    .GroupJoin(
        numbers,
        dateWithIndex => dateWithIndex.Index,
        num => (num - 1) / 2,
        (dateWithIndex, nums) => new[] 
        { 
            new { Date = dateWithIndex.Date, Number = nums.First() },
            new { Date = dateWithIndex.Date, Number = nums.Last() }
        })
    .SelectMany(grp => grp);
Run Code Online (Sandbox Code Playgroud)

示例: https: //dotnetfiddle.net/2IIKhj

这是它的工作原理:

  1. 将日期列表投影到包含每个日期的索引和日期本身的新序列中
  2. GroupJoin那个带有数字列表的集合。要将两者关联起来,请使用Index我们从步骤 1 中获得的日期,并且(num - 1) / 2,因为Index是从零开始的。
  3. 要构建结果,请创建一个包含两项的新数组,其中一项对应与日期关联的数字。
  4. 最后,调用SelectMany压平序列。