看看这代码如何优化最好。

ioriliao1 2010-06-24 09:45:51

DataTable NearPoint(DataTable dt){
//Math.Sqrt((x1-x2)^2+(y1-y2)^2)
double x=0,y=0,result=0,min=0;
foreach(DataRow r1 in dt.Rows){
bool flag=true;
foreach(DataRow r2 in dt.Rows){
if(r1!=r2){
x=Math.Pow(Convert.ToDouble(r1[1])-Convert.ToDouble(r2[1]),2);
y=Math.Pow(Convert.ToDouble(r1[2])-Convert.ToDouble(r2[2]),2);
result=Math.Sqrt(x+y);
if(flag){ //主要是这个if的用法是否是最优的?有没有更好的方法代替?
min=result;
flag=false;
}
if(min>result){
min=result;
}
}
}
}
return new DataTable();
}

...全文
65 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ioriliao1 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyazhe 的回复:]
写反了。
double min = double.MaxValue;

这样确保min比数据库中的任何一个值都大,就不用你的判断了。
[/Quote]
谢谢,已经如下解决!

DataTable NearPoint(DataTable dt){
//Math.Sqrt((x1-x2)^2+(y1-y2)^2)
double x=0,y=0,result=0;
foreach(DataRow r1 in dt.Rows){
double min=double.MaxValue;
foreach(DataRow r2 in dt.Rows){
if(r1!=r2){
x=Math.Pow(Convert.ToDouble(r1[1])-Convert.ToDouble(r2[1]),2);
y=Math.Pow(Convert.ToDouble(r1[2])-Convert.ToDouble(r2[2]),2);
result=Math.Sqrt(x+y);

if(min>result){
min=result;
}
}
}
}
return new DataTable();
}


wdzczy 2010-06-24
  • 打赏
  • 举报
回复
能否帮我解决一下这个问题http://topic.csdn.net/u/20100624/22/61da21e9-8826-489a-9a76-2741c06cb5e1.html?79378


[Quote=引用 6 楼 mail_ricklee 的回复:]
C# code

DataTable NearPoint(DataTable dt){
double x=0,y=0,result=0,min=0;
var drcount=dt.Rows.Count;
for(var i=0;i<drcount;i++){
var r1=dt.Ro……
[/Quote]
xuhongliu 2010-06-24
  • 打赏
  • 举报
回复
看不懂你那个代码的意思,这样第二循环有什么意义?
if(min>result)代码能执行吗?
mail_ricklee 2010-06-24
  • 打赏
  • 举报
回复

DataTable NearPoint(DataTable dt){
double x=0,y=0,result=0,min=0;
var drcount=dt.Rows.Count;
for(var i=0;i<drcount;i++){
var r1=dt.Rows[i];
bool flag=true;
for(var ii=0;ii<drcount;ii++){
var r2=dt.Rows[ii];
if(!r1r2.Equals(r2)){
x=Math.Pow(Convert.ToDouble(r1[1])-Convert.ToDouble(r2[1]),2);
y=Math.Pow(Convert.ToDouble(r1[2])-Convert.ToDouble(r2[2]),2);
result=Math.Sqrt(x+y);
if(flag){ //主要是这个if的用法是否是最优的?有没有更好的方法代替?
min=result;
flag=false;
break;
}
if(min>result){
min=result;
}
}
}
}
return new DataTable();
}

xuhongliu 2010-06-24
  • 打赏
  • 举报
回复
if(flag)这一段代码只有在第二个循环执行第一次的时候才会执行。Math.Sqrt的值一定大于0
foreach(DataRow r1 in dt.Rows){
//bool flag=true;
min=0;
foreach(DataRow r2 in dt.Rows){
if(r1!=r2){
x=Math.Pow(Convert.ToDouble(r1[1])-Convert.ToDouble(r2[1]),2);
y=Math.Pow(Convert.ToDouble(r1[2])-Convert.ToDouble(r2[2]),2);
result=Math.Sqrt(x+y);

// if(flag){ //主要是这个if的用法是否是最优的?有没有更好的方法代替?
// min=result;
// flag=false;
// }
if(min>result){
min=result;
}
}
}
}

兔子-顾问 2010-06-24
  • 打赏
  • 举报
回复
写反了。
double min = double.MaxValue;

这样确保min比数据库中的任何一个值都大,就不用你的判断了。
兔子-顾问 2010-06-24
  • 打赏
  • 举报
回复
直接删掉判断不就可以了?min初始化改为:
double min = double.MinValue;
ioriliao1 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
返回结果和你执行过程没关系。不知道怎么优化。直接linq获取集合?
[/Quote]
不必理会返回结果,我是想知道有没有更好的方法可以代替if(flag)这一段代码。
兔子-顾问 2010-06-24
  • 打赏
  • 举报
回复
返回结果和你执行过程没关系。不知道怎么优化。直接linq获取集合?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧