如果我有这样的日期列表:
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
答案 0 :(得分:4)
这是一个简单的解决方案:
dates
是DateTime
的列表,会话是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
以下是如何运作的:
GroupJoin
该集合包含数字列表。要关联这两者,请使用我们从第1步获得的Index
作为日期,并使用(num - 1) / 2
,因为Index
从零开始。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>>();