2017-04-15 27 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" 
相關問題