C# 如何查找列表中项目的最大连续出现次数?

C# 如何查找列表中项目的最大连续出现次数?,c#,list,C#,List,我想在列表中查找字符串的最大连续出现次数。 假设我有一张名单,上面有司机。姓名,司机。国籍,司机。汽车 现在我们有了一个比赛列表,我把获胜者储存在一个列表中 我想看看法拉利车队连续获胜或法国车手连续获胜的次数最多 Drivers.add{Alex, French, Ferrari} Drivers.add{Peter, Russian, Ferrari} Drivers.add{John, USA, Mercedes} Drivers.add{May, USA, Toyota} Drivers.

我想在列表中查找字符串的最大连续出现次数。 假设我有一张名单,上面有司机。姓名,司机。国籍,司机。汽车 现在我们有了一个比赛列表,我把获胜者储存在一个列表中

我想看看法拉利车队连续获胜或法国车手连续获胜的次数最多

Drivers.add{Alex, French, Ferrari}
Drivers.add{Peter, Russian, Ferrari}
Drivers.add{John, USA, Mercedes}
Drivers.add{May, USA, Toyota}
Drivers.add{Hannah, French, Mercedes}

List<Drivers> Winners
Alex,
Peter,
Alex,
John
May,
John,
Hannah

And the results:
Max Ferrari 3
Max USA 3

您应该能够及时做到这一点,只需为字符串的“最大运行长度”使用一个int变量,为“当前运行长度”使用一个int变量。您可以在列表上迭代并跟踪当前和最大运行长度。

没有简单的方法,因为.NET没有任何用于对连续项目进行分组的方法

var Drivers = new[] { new { Name = "Alex"  , Team = "Ferrari"  },
                      new { Name = "Peter" , Team = "Ferrari"  },
                      new { Name = "John"  , Team = "Mercedes" },
                      new { Name = "May"   , Team = "Toyota"   },
                      new { Name = "Hannah", Team = "Mercedes" } };

var Winners = "Alex Peter Alex John May John Hannah".Split();

var Teams = Winners.Join(Drivers, w => w, d => d.Name, (w, d) => d.Team);   // Ferrari, Ferrari, Ferrari, Mercedes, Toyota, Mercedes, Mercedes

var Counts = Teams.Aggregate(new List<Tuple<int, string>>(), (L, t) => { L.Add(
    Tuple.Create(L.Any() && L.Last().Item2 == t ? L.Last().Item1 + 1 : 1, t)); return L; });   // (1, Ferrari), (2, Ferrari), (3, Ferrari), (1, Mercedes), (1, Toyota), (1, Mercedes), (2, Mercedes)

var Max = Counts.Max();    // (3, Ferrari)

谢谢。这是我在堆栈中的第一个问题,我发现我不够准确。对不起。。你提到的方法是显而易见的,但我认为可能有一些较短的方法,比如我们可以通过LINQ的列表项来计数/区分计数等。再次感谢你的回答!!您可以创建自己的扩展方法来实现这一点,以便在整个应用程序中重用它。如果您不熟悉,这里有更多相关信息:。扩展方法可以接受上面添加的目标字符串和字符串选择器。我其实是在寻找一些优雅的方式。我是c语言的新手,如果我问了一些愚蠢的问题,我很抱歉。
var Drivers = new[] { new { Name = "Alex"  , Team = "Ferrari"  },
                      new { Name = "Peter" , Team = "Ferrari"  },
                      new { Name = "John"  , Team = "Mercedes" },
                      new { Name = "May"   , Team = "Toyota"   },
                      new { Name = "Hannah", Team = "Mercedes" } };

var Winners = "Alex Peter Alex John May John Hannah".Split();

var Teams = Winners.Join(Drivers, w => w, d => d.Name, (w, d) => d.Team);   // Ferrari, Ferrari, Ferrari, Mercedes, Toyota, Mercedes, Mercedes

var Counts = Teams.Aggregate(new List<Tuple<int, string>>(), (L, t) => { L.Add(
    Tuple.Create(L.Any() && L.Last().Item2 == t ? L.Last().Item1 + 1 : 1, t)); return L; });   // (1, Ferrari), (2, Ferrari), (3, Ferrari), (1, Mercedes), (1, Toyota), (1, Mercedes), (2, Mercedes)

var Max = Counts.Max();    // (3, Ferrari)
var Max = Teams.GroupAdjacent(t => t).MaxBy(g => g.Count());

Debug.Print("Max " + Max.Key + " " + Max.Count()); // "Max Ferrari 3"