如何使用LINQ计算最长条纹?

mus*_*fan 5 c# linq

目前,这只是我很好奇的事情,我没有任何我正在研究的代码,但我想知道如何实现这一目标......

让我们举例来说,我有一个应用程序可以追踪世界上所有足球队的成绩.我希望能够确定任何特定球队最长的"胜利"连胜纪录.

我想我很可能会有这样的数据表:

  • MatchDate日期时间
  • TeamA字符串
  • TeamB字符串
  • TeamAGoals int
  • TeamBGoals int

所以我想要做的就是找到最长的连胜位置TeamA = "My Team",显然这意味着TeamAGoals必须大于TeamBGoals.

正如我所说,这只是一个例子.对于这样的事情,对于不同的DB设计可能更好.但根本问题是如何计算匹配结果的最长条纹/运行.

Ser*_*kiy 2

您可以通过单个查询获得团队的所有结果:

var results = from m in Matches
            let homeMatch = m.TeamA == teamName
            let awayMatch = m.TeamB == teamName
            let hasWon = (homeMatch && m.TeamAGoals > m.TeamBGoals) || 
                         (awayMatch && m.TeamBGoals > m.TeamAGoals)
            where homeMatch || awayMatch
            orderby m.MatchDate
            select hasWon;
Run Code Online (Sandbox Code Playgroud)

然后简单计算最长连胜:

int longestStreak = 0;
int currentStreak = 0;

foreach (var hasWon in results)
{
    if (hasWon)
    {
        currentStreak++;
        if (currentStreak > longestStreak)
            longestStreak = currentStreak;

        continue;
    }

    currentStreak = 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以按原样使用它、提取到方法或创建 IEnumerable 扩展来计算结果中的最长序列。