使用容差对值进行排序

时间:2017-12-01 08:31:04

标签: c# sorting datatable

我试图用X和Y值对对象的数据进行排序,以便它按Y然后按X排序。这一切都正常,但我想知道是否有办法添加一个公差值,以便当两个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();

1 个答案:

答案 0 :(得分: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);