2017-04-15 54 views
-3

我想查找列表中字符串的最大连续出现次数。 比方说,我有表,司机已经Driver.Name,Driver.Nationality,Driver.Car 现在我们有比赛的一个列表,其中,我优胜者存储在一个列表如何查找列表<>中某个项目的最大连续出现次数?

我想看看什么是最法拉利连续赢得冠军,或法国车手连续赢得冠军。

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 

下面是我用颜色参数尝试的方式。 “R”是赛车手的名单。它的作品,我只是寻找更优雅的方式。

foreach(var e in R) 
{ 
    if (e.Color == lastColor) 
    { Current++; 
    if (Current > Max) { Max = Current; maxColor = e.Color; } 
    } 
    else { lastColor = e.Color; Current = 1; } 
} 
+1

你尝试过这么远吗? –

+0

已在上面添加。我其实正在寻找一些优雅的方式。我在c#中很新,很抱歉,如果我问的是愚蠢的问题。 – Ember

回答

0

您应该能够通过只使用“最大行程”和字符串“当前行程” int变量int变量为此在O(n)的时间。您可以遍历列表并跟踪当前和最大运行长度。

+0

非常感谢。这是我在Stack中的第一个问题,我看到我不够准确(对不起)。你提到的方式很明显,但我想也许有一些更简单的方法,就像我们可以计数/不同计数等一样。用LINQ列出项目。再次感谢您的回答! – Ember

+0

您可以创建自己的扩展方法来执行此操作,以便在整个应用程序中重复使用它。如果您不熟悉,请参阅以下网址:https://msdn.microsoft.com/en-us/library/mt693056.aspx。你的扩展方法可以接受目标字符串和一个字符串选择器Func – pbarrasso

0

有没有简单的方法,因为.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) 

自定义扩展方法,如MoreLinq可以用来缩短总结部分:

var Max = Teams.GroupAdjacent(t => t).MaxBy(g => g.Count()); 

Debug.Print("Max " + Max.Key + " " + Max.Count()); // "Max Ferrari 3" 
相关问题