如何使用linq映射两个列表

时间:2014-10-17 13:06:49

标签: c# asp.net linq list collections

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

List<DateTime>  {5-10-2014,6-10-2014,7-10-2014}

我有这样的会议列表:

List<int>  {1,2,3,4,5,6}

如何将会话映射到日期,考虑到每个日期按顺序有两个会话(使用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

5 个答案:

答案 0 :(得分:4)

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

datesDateTime的列表,会话是int的列表。

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

结果包含IEnumerable anonymous objects,你可以像这样访问它的属性:

foreach(var sessionDate in result)
{
   var date = sessionDate.Date;
   var session = sessionDate.Session.
}

答案 1 :(得分:4)

通过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);

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

以下是如何运作的:

  1. 将日期列表投影到包含每个日期的索引和日期本身的新序列
  2. GroupJoin该集合包含数字列表。要关联这两者,请使用我们从第1步获得的Index作为日期,并使用(num - 1) / 2,因为Index从零开始。
  3. 要构建reusult,请创建一个包含两个项目的新数组,每个项目对应一个与日期关联的数字。
  4. 最后,请致电SelectMany以平整序列。

答案 2 :(得分:2)

假设listi.Length == 2 * listd.Length

List<int> listi = new int[] { 1, 2, 3, 4, 5, 6 }.ToList();
List<DateTime> listd = new DateTime[] { DateTime.Parse("5-10-2014"), DateTime.Parse("6-10-2014"), DateTime.Parse("7-10-2014") }.ToList();

IEnumerable<Tuple<DateTime, int>> result = 
    Enumerable.Range(0, listi.Count)
    .Select(x => new Tuple<DateTime, int>(listd[x / 2], listi[x]));

答案 3 :(得分:1)

如果您使用.Net 4.0或更高版本开发项目,则可以使用Zip()。

IEnumerable<int> keys = new List<int>() { 1, 2, 3, 4, 5, 6 }; // your keys
IEnumerable<DateTime> values = new List<DateTime>() { DateTime.Parse("5 - 10 - 2014"), DateTime.Parse("6 - 10 - 2014"), DateTime.Parse("7 - 10 - 2014") }; // your values
var mappedDictionary = keys.Zip(values, (k, v) => new {
            k,
            v
        }).ToDictionary(x => x.k, x => x.v);

此链接证明了它的工作原理.. https://dotnetfiddle.net/yKYf8S

答案 4 :(得分:1)

我认为在C#中映射值的最佳方法是使用Dictionary<Key,Value>。您可以拥有一对多的关系 - 也就是说,一个日期有多个会话。代码如下所示:

Dictionary<DateTime, List<int>> dicDateSesstion = new Dictionary<DateTime, List<int>>();