0

我有两个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 中做到这一点。

4

3 回答 3

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 };

这将在给定日期返回视图数,否则返回 0。

如何:执行左外连接

于 2013-05-02T08:22:09.783 回答
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
                         });   

没有视图的天数填充为零

于 2013-05-02T08:54:24.513 回答
0

看看这篇 MSDN 文章:http: //msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

它解释了如何进行左外连接,这是您在这种情况下所需要的。

于 2013-05-02T08:05:13.667 回答