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 に答える