私はすべての点の平均点として計算する基準点に関して極角でソートする点(x、y)のリストを持っていますリスト内の 極角を計算するために参照点を渡すことができるようにIComparerを設定するにはどうすればよいですか?C# - 入力として引数を取るカスタムIComparer <T>
0
A
答えて
3
すなわち
:
class PointComparer : IComparer<Point>
{
private readonly Point referencePoint;
public PointComparer(Point referencePoint)
{
this.referencePoint = referencePoint;
}
public Int32 Compare(Point x, Point y)
{
// Compare using referencePoint
}
}
使用法:
var ordered = myList.OrderBy(x => x, new PointComparer(calculatedReferencePoint));
私はOrderyBy
を使用後者が詐欺であるため、Sort
ではありません私たちがドキュメントを参照するときは、安定した並べ替えをしていません。
1
あなたには2つのオプションがあります。
オプション
基準点は、あなたのPoint
オブジェクトの一部でなければなりません。したがって、Point
のCompareメソッドでは、角度を計算してオブジェクトを比較するために考慮する必要があります。
public int IComparer.Compare(Point x, Point y) {
var angleX = Utilities.CalculateAngle(x.ReferencePoint);
var angleY = Utilities.CalculateAngle(y.ReferencePoint);
if (angleX < angleY) return -1;
if (angleX == angleY) return 0;
if (angleX > angleY) return 1;
// Or simply "return angleX - angleY;"
}
オプションB Angle
が既にあなたのポイントで計算されなければならない
。 Point
を不変構造にし、構造のインスタンス化時の角度を計算します。その後、そのプロパティーはOrderBy
となります。あなたが事前に基準点を計算し、あなたのIComparer
のコンストラクタに渡すことができ
public struct Point
{
public double Angle { get; private set; }
public Point(double referencePoint, double x, double y)
{
// TODO: Calculate Angle
}
}
points.OrderBy(p => p.Angle);
関連する問題
- 1. C++引数としてテキストドキュメントの文字列を入力する
- 2. Python - コマンドライン引数として辞書(ハッシュ入力)を取る
- 3. C#ラムダ式とIComparer
- 4. カスタムT-SQL Order By(IComparer)
- 5. C++、main関数の入力引数
- 6. C#IComparerを使用して英数字リストをソートする
- 7. コールバックの入力引数として出力を渡します。
- 8. R - 関数の入力引数としてのリストのリスト
- 9. カスタムIComparerを使用してCollectionViewSourceを並べ替える
- 10. カスタムIComparerを使用してポインタ値で注文する
- 11. C++で入力引数として任意のポインタを取ることはできますか?
- 12. Autofac:入力引数と出力引数の両方で型を解決する
- 13. ...関数の引数を別の関数の入力として使用する
- 14. javaのコンストラクタ引数としてスキャナ入力を使用する
- 15. Bash:Can Here Strings <<<複数の変数を入力として扱う?
- 16. は、入力引数
- 17. Python - 関数の引数としてのユーザー入力?
- 18. QTの関数入力引数としてのQComboBox
- 19. Javascript:引数としてフォームの入力を受け取るコンストラクタを作成しようとしています
- 20. C#IComparerクラスにリポジトリを挿入するには?
- 21. boost:入力タイプとしてchar *を取るレガシーC関数を使ったscoped_ptr?
- 22. 引数をbashの入力ストリームとして扱います
- 23. 引数としてmatlab plot()に構造体を入力
- 24. mybatisコンストラクタの引数として入力パラメータを使用
- 25. mat2cell入力引数のエラー
- 26. コンソールでCtrl + Cを入力として取得するには
- 27. は、入力として次の文字列を取るC#で
- 28. 引数としてC++クラスタイプ
- 29. JavaScriptのオートコンプリートを使用してPHP入力フォーム引数を取得する
- 30. 角2テンプレート入力とカスタム入力
まさに私が探していたもの、ありがとう! –
また、_class_タイプの 'Comparer'から派生させることもできます。 'Compare(Point、Point)'メソッド(今度は、基底クラスから継承した 'abstract'メソッドの' override')が必要ですが、IComparer と古いものジェネリックでないIComparer。 –
'OrderBy'を使うと、カスタムクラスをスキップし、' Comparison 'デリゲート(lambda)でその参照ポイントをキャプチャ(クローズ)することもできます。これは 'myList.OrderBy(x =>/* xとcomputedReferencePoint * /を含む式)'になります。比較者が本当に必要な場合は、 'Comparer .Create(x =>/* expression for x and computedReferencePoint * /)'のように 'Create'を使って取得することができます。これにより、カスタムクラスを自分で書く必要がなくなります。 –