我有两个IEnumerables
。一个包含日期,另一个包含数据。
DateTime start = DateTime.Today.AddDays(-21);
var dates = Enumerable.Range(0, 21).Select(n => start.AddDays(n)).ToArray();
var data = MyClass.Data.Select(x => new { Date = x.Date, Views = x.Count });
我正在尝试构建一个在给定日期显示Views
的表格。但是,数据包含一些空白。如何编写连接两个集合的linq查询,并在存在时返回Views
数字,或者在数据中没有匹配对象时返回0?
我可以用foreach语句的老式方式做到这一点,但我想知道如何在Linq中做到这一点。
答案 0 :(得分:1)
这应该有效:
var data = from day in Enumerable.Range(0, 21).Select(n => start.AddDays(n))
join d in MyClass.Data.Select(x => new { Date = x.Date, Views = x.Count })
on day equals d.Date into gj
from dd in gj.DefaultIfEmpty()
select new { Date = day, Views = dd == null ? 0 : dd.Views };
当给定日期有一个时返回views-number,否则返回0。
答案 1 :(得分:1)
我不确定我是否完全理解您的问题。如果您想生成至少包含一个视图的日期列表,那么这将完成工作。
DateTime start = DateTime.Today.AddDays(-21);
//Sample view data
var viewsData = new[] {new {id = "id", date = new DateTime(2013, 4, 12), views = 25}};
var dates = Enumerable.Range(0, 21)
.Select(d => start.AddDays(d))
.Select(n => new
{
Day = n,
views =viewsData.Any(x => x.date == n)
? viewsData.FirstOrDefault(v => v.date == n).views
: 0
});
在没有视图的日子里填充零
答案 2 :(得分:0)
查看此MSDN文章:http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx
它解释了如何在这种情况下进行左外连接。