2017-03-09 69 views
1

上下文:我正在設計一個排行榜,並希望將數據從最高分數顯示到最低分數。問題是數據包含從文本文件導入的字符串和整數。目前我能夠對數據進行數字排序,但是我使用的OrderByDescending函數不起作用。訂購時,例如11,4,5,8,23,65 = 8,65,5,4,23,11(按字母順序排序)。 該列表中包含的數據:名稱(字符串),困難(字符串)和得分(int)和我想以降序排序數據:例如第一= 10,第二= 9等從數字上從高到低對列表(字符串)進行排序c#

List<string> leaderboardList = new List<string>(); 
StreamReader srUserData = new StreamReader(@"User Leaderboard.txt"); 
while ((userDataLine = srUserData.ReadLine()) != null) 
     { 
      leaderboardList.Add(userDataLine); 
     } 

leaderboardList = leaderboardList.OrderByDescending(x => Regex.Match(x, @"\d+").Value).ToList(); 

Regex.Match找到字符串中的數字。 基本上最後一行是需要修改的行。 歡迎所有幫助,謝謝。

編輯:數據應以形式輸出名稱,難度,得分和排序數據以降序排列,得分最高。

+1

這個數據你會執行多個功能嗎?爲什麼不將數據一次解析成具有單獨屬性的類?這樣你就可以解析數據一次,然後在本機類型上執行各種函數(排序,字符串操作等) – maccettura

回答

1

只是改變:

leaderboardList = leaderboardList.OrderByDescending(x => 
    Regex.Match(x, @"\d+").Value).ToList(); 

要:

leaderboardList = leaderboardList.OrderByDescending(x => 
    Int32.Parse(Regex.Match(x, @"\d+").Value)).ToList(); 

只需添加Int32.Parse真的。一個警告雖然:如果你傳遞一個字符串不是一個數字Int32.Parse()會拋出一個異常。如果這是需要處理的可能性,那麼您可以使用Int32.TryParse代替。

例:

​​

使用下面的示例列表測試:

List<string> leaderboardList = new List<string>(); 
leaderboardList.Add("Brandon|Easy|9"); 
leaderboardList.Add("Yoda|Impossible|9001"); 
leaderboardList.Add("Barney|Easy|-1"); 
leaderboardList.Add("John|Normal|500"); 

此代碼工作正常,並且沒有所需的TryParse代碼。

輸出:

Yoda|Impossible|9001 
John|Normal|500 
Brandon|Easy|9 
Barney|Easy|-1 
+0

在mscorlib.dll中發生未處理的類型'System.FormatException'異常 –

+0

排行榜列表中的數據包括一個名字,一個難度,例如easy,然後是數字 –

+0

@OranPower查看我在編輯中用於測試的示例列表。這與您輸入的數據是否相符? –

0

你可以去老同學和執行Integer.TryParse或者這些功能的某些衍生物。一旦你這樣做,你可以將它們追加到整數列表中。

int number; 
bool result = Int32.TryParse(value, out number); 
if (result) { 
Console.WriteLine("Converted '{0}' to {1}.", value, number); 
} 
0

你錯過了一兩件事,那就是你是不是正則表達式轉換價值爲int。請檢查下面的代碼,它適用於我。

CODE:

List<string> leaderboardList = new List<string>(); 
leaderboardList.Add("A,A,9"); 
leaderboardList.Add("B,B,8"); 
leaderboardList.Add("G,C,65"); 
leaderboardList.Add("S,B,10"); 

leaderboardList = leaderboardList.OrderByDescending(x =>Convert.ToInt32((string.IsNullOrEmpty(Regex.Match(x, @"\d+").Value)?"0":Regex.Match(x, @"\d+").Value))).ToList(); 
foreach (var item in leaderboardList) 
{ 
    Console.WriteLine(item); 
} 

在線輸出:.Net Fiddle Output

+0

錯誤:輸入字符串格式不正確。 –

+0

你能分享你的樣本數據嗎?這將有助於解決這個錯誤。 – csharpbd

+0

輸入:例如ORAN阿森納硬3 –

2

我建議從其他人完全不同的方法。從磁盤加載你的字符串,然後解析它到你定義的類中。例如:

public class LeaderboardRow 
{ 
    public string Name { get; set; } 
    public string Difficulty { get; set; } 
    public int Score { get; set; } 
} 

然後你的代碼看起來更象這樣:

List<LeaderboardRow> leaderboardList = new List<LeaderboardRow>(); 
StreamReader srUserData = new StreamReader(@"User Leaderboard.txt"); 
while ((userDataLine = srUserData.ReadLine()) != null) 
{ 
    //Put logic here that parses your string row into 3 distinct values 
    leaderboardList.Add(new LeaderboardRow() 
    { 
     Score = 0, //put real value here 
     Name = string.Empty, //put real value here 
     Difficulty = string.Empty //put real value here 
    }); 
} 

然後,你需要做任何的排序是一個簡單的LINQ聲明:

leaderboardList = leaderboardList.OrderByDescending(x => x.Score).ToList(); 

根據您的情況/您可以將此文本存儲爲json,這樣可以加速並簡化您的應用程序。

0

您可以使用此命令來排序字符串中的數字列表或包含數字的字符串列表。

The Alphanum Algorithm

我希望這對你的作品。

相關問題