0

如果我有这样的列表:

var teams = new List() { "Team A", "Team B", "Team C" };

我有一个分数如下的数据集:

var scores = new List<scoredata> {
    new scoredata() { Team = 'Team A', Date = '1/1/2012', Value = 1 }, 
    new scoredata() { Team = 'Team B', Date = '1/1/2012', Value = 1 }, 
    new scoredata() { Team = 'Team C', Date = '1/1/2012', Value = 1 }, 
    new scoredata() { Team = 'Team A', Date = '1/2/2012', Value = 2 }, 
    new scoredata() { Team = 'Team B', Date = '1/3/2012', Value = 3 }, 
    new scoredata() { Team = 'Team C', Date = '1/4/2012', Value = 4 }
}

是否可以构建一个看起来像这样的数据集?

Team A, '1/1/2012', 1
Team B, '1/1/2012', 1
Team C, '1/1/2012', 1
Team A, '1/2/2012', 2
Team B, '1/2/2012', null
Team C, '1/2/2012', null
Team A, '1/3/2012', null
Team B, '1/3/2012', 3
Team C, '1/3/2012', null
Team A, '1/4/2012', null
Team B, '1/4/2012', null
Team C, '1/4/2012', 4

我不确定这叫什么,但我想在我的最终数据集中填写空白日期和分数,以便它始终返回每个日期的所有团队,但如果分数数据不可用则返回 null。

4

2 回答 2

3
var dates = scores.Select(s => s.Date).Distinct();

var result =    
    from date in dates
    from team in teams
    let teamScores = scores.Where(s => s.Team == team && s.Date == date)
    orderby date
    select new { team, date, Score = teamScores.FirstOrDefault() };

不过没有用编译器检查,试一试。

于 2012-08-11T00:29:34.603 回答
2

使用纯 LINQ to Objects。

public class ScoreData
{
    public string Team { get; set; }
    public string Date { get; set; }
    public int? Value { get; set; }
}
var teams = new[] { "Team A", "Team B", "Team C" };
var scores = new[]
{
    new ScoreData { Team = "Team A", Date = "1/1/2012", Value = 1 }, 
    new ScoreData { Team = "Team B", Date = "1/1/2012", Value = 1 }, 
    new ScoreData { Team = "Team C", Date = "1/1/2012", Value = 1 }, 
    new ScoreData { Team = "Team A", Date = "1/2/2012", Value = 2 }, 
    new ScoreData { Team = "Team B", Date = "1/3/2012", Value = 3 }, 
    new ScoreData { Team = "Team C", Date = "1/4/2012", Value = 4 },
};

var dates = scores.Select(score => score.Date).Distinct();
var query =
    from date in dates
    from team in teams
    join score in scores
        on new { Team = team, Date = date }
        equals new { score.Team, score.Date }
        into filteredScores
    let defaultScore = new ScoreData
    {
        Team = team,
        Date = date,
        Value = null,
    }
    from score in filteredScores.DefaultIfEmpty(defaultScore)
    select score;

请注意,这很可能不会在 LINQ to SQL 或 LINQ to Entities 中按原样工作,它需要一些调整。

于 2012-08-11T00:27:31.027 回答