无论如何转换ILookup<DateTime,List<int>> to ILookup<DateTime,int>
?
我使用“ToLookup”方法创建查找,但我无法按照我想要的方式创建它。我一直陷入List<int>
而不仅仅是int。
替代问题(它也可以解决我的问题) - 如何从IGrouping<DateTime,MyModel>
创建查找以ILookup<DateTime,int>
MyModel包含2个整数[min,max](例如2,5),我希望查找日期包含它们之间的所有整数(2,3,4,5)
编辑: 我目前的做法是错误的。 为MyModel: 日期时间日期 int min int max
一开始我有MyModel的IQueryable。 我试图让每个日期的所有整数成为ILookup。
例如 - 假设我有2个MyModels。
1st
Date = 2.01.2016
min = 2
max = 5
2nd
Date = 2.01.2016
min = 9
max = 12
我需要Lookup<DateTime, int>
,其中&lt; 2.01.2016,&lt; 2,3,4,5,9,10,11,12&gt;&gt;
答案 0 :(得分:0)
假设您的ILookup<DateTime,List<int>>
包含您要与每个int
关联的所有DateTime
,则需要先将您的初始数据展平:
var flat = lookup1.SelectMany(i => i, (dt, num) => new {dt, num});
这会为您提供与其int
相关联的每个DateTime
个对。然后你可以使用ToLookup从中创建一个新的Lookup:
var lookup2 = flat.ToLookup(i => i.dt, i => i.num);
答案 1 :(得分:0)
为了创建日期到数字的查找,首先需要生成日期和数字的所有可能组合。目前还不清楚您的数据来源是什么,但假设它来自某个数据库,您可能希望对它们进行排序(查找将按其枚举的顺序排序),生成值范围,然后创建查找。
var orderedData =
from x in context.MyModel
orderby x.Date, x.Min
select x;
var query =
(from x in orderedData.AsEnumerable()
from i in Enumerable.Range(x.Min, x.Max - x.Min + 1)
select new { x.Date, i }).ToLookup(x => x.Date, x => x.i);
答案 2 :(得分:0)
对于每个MyModel
,您可以创建一组键值对,其键是Date
属性,值从min
到max
(为此,你必须使用Linq to Objects
)执行查询:
var pairs = models.AsEnumerable().SelectMany(m => Enumerable.Range(m.Min, m.Max - m.Min + 1)
.Select(v => new { Key = m.Date, Value = v }));
然后将此集合投影到查找:
var lookup = pairs.ToLookup(kv => kv.Key, kv => kv.Value);
答案 3 :(得分:0)
我认为你最终必须做两个投影 - 首先是一个selectmany来生成范围,然后选择一个select来让你创建一个标准化的集合来增加你的查找...
var first = new MyModel
{
date = new DateTime(2016, 2, 1),
min = 2,
max = 5
};
var second = new MyModel
{
date = new DateTime(2016, 2, 1),
min = 9,
max = 12
};
// new []{first,second} is the placeholder for
// whatever list you're using
var normalized = new []{first, second}.SelectMany(x =>
Enumerable.Range(x.min, x.max - x.min + 1)
.Select(y => new {x.date, number = y}));
// this should give you {2.01.2016, <2,3,4,5,9,10,11,12>}
var lookup = normalized.ToLookup(x => x.date, y=> y.number);