我试图用X和Y值对对象的数据进行排序,以便它按Y然后按X排序。这一切都正常,但我想知道是否有办法添加一个公差值,以便当两个Y值在该公差范围内时,它们被视为相同并且仅按相应的X值排序。 例如:
X=4 and Y=4.1
。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 :(得分: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);