2017-12-01 3 views
0

私はXとY値でオブジェクトのデータテーブルをソートしようとしています。これはYとXでソートされます。これですべて正常に動作しますが、 2つのY値がその許容範囲内にある場合、それらが同じとみなされ、対応するX値だけでソートされるように、許容値を追加します。 例:許容値で値をソートする

  • オブジェクト1はX=4 and Y=4.1です。
  • オブジェクト2はX=6 and Y=4です。

0.1差が所定の許容値内であれば、1と2の順に並べ替えるようにしますが、この違いによって2と1の順に並べ替えます。 これはRevit APIプロジェクトの一部ですが、これは一般的なC#の質問にすぎません。テーブルはobjectListと呼ばれるオブジェクトのリストからデータを取得します。 私が欲しいものを達成する方法はありますか?

コード:

// Create table 
DataTable obTable = new DataTable(); 

// id 
DataColumn idColumn = new DataColumn(); 
idColumn.DataType = Type.GetType("System.Int32"); 
idColumn.ColumnName = "id"; 
obTable.Columns.Add(idColumn); 

// X 
DataColumn xColumn = new DataColumn(); 
xColumn.DataType = Type.GetType("System.Int32"); 
xColumn.ColumnName = "X"; 
obTable.Columns.Add(xColumn); 

// Y 
DataColumn yColumn = new DataColumn(); 
yColumn.DataType = Type.GetType("System.Int32"); 
yColumn.ColumnName = "Y"; 
obTable.Columns.Add(yColumn); 

// get data from objectList 
foreach (FamilyInstance ob in objectList) 
{ 
    int id = ob.Id.IntegerValue; 
    LocationPoint L = ob.Location as LocationPoint; 
    int X = (int)L.Point.X; 
    int Y = (int)L.Point.Y; 

    DataRow row; 
    row = obTable.NewRow(); 

    row["id"] = id; 
    row["X"] = X; 
    row["Y"] = Y; 

    obTable.Rows.Add(row); 
} 

// sort table 
DataView dv = new DataView(obTable); 
dv.Sort = "Y ASC, X ASC"; 
DataTable dt = dv.ToTable(); 
+0

@HimBromBeereありがとうXD –

+0

あなたがたDataTableに挿入する前に、あなたはobjectListを並べ替えることができます。これは、比較(T)デリゲートを実装することによって行うことができます。詳細はこちらをご覧ください:https://msdn.microsoft.com/en-us/library/tfakywbh(v=vs.110).aspx – lamandy

+0

@lamandyしかし、2つの値でリストをソートできますか? Yの値が同じ場合(または指定された許容値内であれば)、Yでソートし、次にXでソートします。それが私が正直であるためにデータテーブルを使用している唯一の目的です。 –

答えて

1
private static int CompareWithThreshold(FamilyInstance obj1, FamilyInstance obj2) 
{ 
    LocationPoint point1 = obj1.Location as LocationPoint; 
    LocationPoint point2 = obj2.Location as LocationPoint; 
    double x1 = point1.Point.X; 
    double y1 = point1.Point.Y; 
    double x2 = point2.Point.X; 
    double y2 = point2.Point.Y; 
    double diff = y1 - y2; 
    if (diff >= -0.1 && diff <= 0.1) 
    { 
     return x1.CompareTo(x2); 
    } 
    else 
    { 
     return y1.CompareTo(y2); 
    } 
} 

あなたのリストを並べ替えるには、ちょうど

objectList.Sort(CompareWithThreshold); 
+0

これは機能します!単に 'compareTo'と' sort'を大文字にする必要がありました。ありがとう! –