转换ILookup <datetime,list <int>&gt;到ILookup <datetime,int>

时间:2016-04-11 19:47:41

标签: c#

无论如何转换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;

4 个答案:

答案 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属性,值从minmax(为此,你必须使用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);