2017-05-17 7 views
5

doubleの小数点以下の桁で二重のリストをソートする方法。例えば
入力<1.2, 2.3, 1.12, 5.1>については、ソートした後、出力 はOrderBy()を通してあなたがこれを達成することができます<5.1, 1.12, 1.2, 2.3>C#では、仮数部のリストをソートする方法は?

+0

を使用せずに、以下試すことができますか?何が問題になっているのですか?それとも、あなたのために仕事をしてくれる人がほしいのですか?または質問の歴史は後者を示すようです。 – TnTinMn

+1

ダブルの小数部分を得る方法を知っていますか?あなたはユーザー定義ルールでソートする方法を知っていますか?あるいは、これらの2つのコードをGoogleに提供できますか?それらをまとめると、あなたの答えがあります。 –

答えて

11

と次のようなとして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

Listためには、IComparer<T>のインスタンスを取るSort()方法のoverloadを持っています。 interfaceは実装が非常に簡単で、あなたが好きな方法でソートできるようになります:私はlinqタグが、このソリューションを参照してください

input.Sort(new MantissaComparer()); 

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)); 
    } 
} 

は、このようなカスタム比較子を消費します単純な「IComparer」インターフェースのために「オーバーエンジニアリング」を避けながら、コード全体で再利用可能です。

+0

ウィークスの魅力。ニースの実装 –

1

また、あなたが試みた何Math.Truncate

var sortedlist = list.OrderBy(n => n - (int)n).ToList(); 
Console.Write(String.Join(",", sortedlist)); 
関連する問題