2017-05-17 33 views
5

如何根據double的小數部分對雙精選列表進行排序。
E.g:對於輸入<1.2, 2.3, 1.12, 5.1>,排序後,輸出 應<5.1, 1.12, 1.2, 2.3>在c#中,如何通過尾數排序雙打列表?

+0

你有什麼企圖下面?什麼給你帶來麻煩。還是你只是想讓一些人爲你做這項工作?或者問題歷史似乎表明後者。 – TnTinMn

+1

你知道如何獲得雙倍的小數部分嗎?你知道如何用用戶定義的規則排序嗎?或者你可以谷歌這兩位代碼?把它們放在一起,你有你的答案。 –

回答

11

可以實現這一點通過OrderBy()Math.Truncate方法如下所示。其中x-Math.Truncate(x)爲您提供小數點後的數字,OrderBy將按升序排列它們。看看這個example,並嘗試一下下面的代碼段

List<double> input = new List<double>(){1.2, 2.3, 1.12, 5.1}; 
input = input.OrderBy(x=>x-Math.Truncate(x)).ToList(); 
Console.WriteLine(String.Join("\n",input)); 

或者你可以嘗試這個問題,以及.OrderBy(x=>x-(int)x)而不是爲OrderBy(x=>x-Math.Truncate(x)

1

ListSort()方法接受一個IComparer<T>實例的overload 。該interface是很容易實現,而且可以讓你通過任何你想要的方式進行排序:

public class MantissaComparer : IComparer<double> 
{ 
    public int Compare(double x, double y) 
    { 
     return Comparer<double>.Default.Compare(x - Math.Truncate(x), y - Math.Truncate(y)); 
    } 
} 

然後消耗的自定義比較是這樣的:

input.Sort(new MantissaComparer()); 

我看到linq標籤,但這種解決方案如果您覺得有必要,可以在整個代碼中重複使用,同時避免由於簡單的'IComparer'界面導致的「過度工程」。

+0

將炒鍋的魅力。很好的實施 –

1

您也可以嘗試不使用Math.Truncate

var sortedlist = list.OrderBy(n => n - (int)n).ToList(); 
Console.Write(String.Join(",", sortedlist));