|
[0, 20][20, 0] have the same sum, but aren't close... but if they have the same sum, they could be the same. you know for a fact that if 2 points do not have the same sum, then they aren't ever going to be equivalent. Now, knowing that, if you sort on the sum of the two you would have that to use also. So the sums, would be ascending ala..
List A:[1][2][3][3][3][4][5][5][5][78][9000]... (Longer)
List B:[1][1][3][4][4][4][5][5][6][78][9000]... (Shorter)
What I'm saying is this.
Sort both on the sum.
Pick the shorter list to use for the base comparison.
The following code won't work, but you should get the idea from that.
This doesn't use any kind of fencepost. If it were, we'd save the index of the last matched
in the list and use that as a starting point instead of beginning at the front of the longer list.
<br />
foreach(Point a in shorter){<br />
foreach(Point b in longer){<br />
if(a.Sum != b.Sum) break;<br />
if(a == b)<br />
union.Add(a); break;<br />
}<br />
}<br />
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
|
|
|
|
|
Your approach is right but, ...
I dont know if you red my second post. Matching points is not a matter if they are the same, it is a matter of the distance between then. They may be the same, but they may not
e.g.
lets say const distance = 3;
p1 [0,0]
p2 [2,2]
distance between p1 and p2 is:
d = Math.Sqrt((p2.X-p1.X)^2 + (p2.Y-p1.Y)^2) = 2,3...
(2,3 < 3) == true
so p1 and p2 match.
zilo
|
|
|
|
|
Sorry for the confusion there.
I presume that you're familiar with connected graphs. I'd pre-generate the graph and it's weights to start from. You'll be stuck with the math of making the distances for every node to every other node, but you won't be doing it more than once. But once you have a list of nodes and distances to other nodes you can simply sort out the distances to get the number of nodes that have distances less than what you're looking for. Now you're stuck with a math optimization problem, and there's lots on the net about squeezing performance out of a distance equation.
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
|
|
|
|
|
hmmm.
this would mean to build a graph of all points(nodes) in graphics rectangle? I dnon't think I got you right, because this would mean to connect all points on screen, which is awful lot. But you gave me good idea. Maybe I could hash allready calculated paths and just get the result next time same path will be calculated.
zilo
|
|
|
|
|
Awesome... Here's a link to a good article about using some .NET 3.5 stuff to cache results. I know you're using 2.0, but it's worth the read and it may give you more ideas. http://msdn2.microsoft.com/en-us/vcsharp/bb870976.aspx[^]
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
|
|
|
|
|
Zilo(svk) wrote: I've created my own Point2D struct because accessing fields directly without Properties is much faster when considering a lot of iterations.
Are you sure? I belive JIT compiler does optimize it away, so you are only doing extra work...
Zilo(svk) wrote: I don't understand what's O(n2)
http://en.wikipedia.org/wiki/Big_O_notation[^]
Oversimplification: for N points, it will do N*N "operations".
[ My Blog] "Visual studio desperately needs some performance improvements. It is sometimes almost as slow as eclipse." - Rüdiger Klaehn "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe
|
|
|
|
|
Run this code
using System.Drawing;
using System.Diagnostics;
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
const int count = 100000000;
int x = 0;
Stopwatch watch = new Stopwatch();
Console.WriteLine("Starting Point iteration");
Point p = new Point(1, 1);
Point2D p2d = new Point2D(1, 1);
watch.Start();
for (int i = 0; i < count; i++)
{
x = p.X + p.Y;
}
watch.Stop();
Console.WriteLine("Point iteration took {0} mls\n\r", watch.ElapsedMilliseconds);
watch.Reset();
Console.WriteLine("Starting Point2D iteration");
watch.Start();
for (int i = 0; i < count; i++)
{
x = p2d.X + p2d.Y;
}
watch.Stop();
Console.WriteLine("Point2D iteration took {0} mls", watch.ElapsedMilliseconds);
Console.ReadKey();
}
struct Point2D
{
public int X, Y;
public Point2D(int x, int y)
{
this.X = x;
this.Y = y;
}
}
}
}
zilo
|
|
|
|
|
Right...
Debug, without optimalizations:
Starting Point iteration
Point iteration took 477 mls
Starting Point2D iteration
Point2D iteration took 263 mls
Release, with optimalizations on:
Starting Point iteration
Point iteration took 45 mls
Starting Point2D iteration
Point2D iteration took 43 mls
And same configuration, second run:
Starting Point iteration
Point iteration took 43 mls
Starting Point2D iteration
Point2D iteration took 43 mls
[ My Blog] "Visual studio desperately needs some performance improvements. It is sometimes almost as slow as eclipse." - Rüdiger Klaehn "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe
|
|
|
|
|
You're right, thank you.
zilo
|
|
|
|
|
I want to change this.Cursor = Cursor.SizeWE when user hover mouse over a DataGridView cell's border.
Could you help me ?
|
|
|
|
|
Private Sub dgvInvList_CellBorderStyleChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvInvList.CellMouseEnter
If e.ColumnIndex = dgvInvList.Columns("CName").Index Then
dgvInvList.Cursor = Cursors.Hand
End If
End Sub
Private Sub dgvInvList_CellBorderStyleChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvInvList.CellMouseLeave
If e.ColumnIndex = dgvInvList.Columns("CName").Index Then
dgvInvList.Cursor = Cursors.Default
End If
End Sub
The King is online
|
|
|
|
|
|
Drag and drop a GridView and name it as GridView1
Try the below code for merging the header
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable("Employee");
//Name Age Gender Mobile Phone Email
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Columns.Add("Gender");
dt.Columns.Add("Mobile");
dt.Columns.Add("Phone");
dt.Columns.Add("Email");
dt.Rows.Add("Anoop", "25", "Male", "996633352", "02255566", "anoopukrish@gmail.com");
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
GridView gridView = (GridView)sender;
GridViewRow gridViewRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);
TableCell tableCell = new TableCell();
//add Personal Info
tableCell.Text = "Personal Info";
tableCell.Attributes.Add("style", "text-align: center");
tableCell.ColumnSpan = 3;
gridViewRow.Cells.Add(tableCell);
//Add Contact Info
tableCell = new TableCell();
tableCell.Attributes.Add("style", "text-align: center");
tableCell.Text = "Contact Info";
tableCell.ColumnSpan = 3;
gridViewRow.Cells.Add(tableCell);
GridView1.Controls[0].Controls.AddAt(0, gridViewRow);
}
}
... There by u get the desired output...
|
|
|
|
|
Just a note:
The original question was how to merge a *DataGridView* Control.
The answer above appears to show how to merge a *GridView* Control.
The two controls are not the same.
|
|
|
|
|
Hi All,
I have a datatable with som rows. for example :
activity date time
a 01-01-07 12:00
b 01-01-08 13:00
c 01-01-07 12:00
As you can see, activity a and c have the same date and time. Now i have to filter those rows from the datatable and set them into a textbox. So how can i compare all rows with eachother and if they have the same date and time, then show them in a textbox????
Thanx.
|
|
|
|
|
In the RowCreated event of GridView match each row from datatable to that of the time in the new created row. if it matches show it in textbox else leave it as it is. Take care that the activity is not matching.
|
|
|
|
|
Hi Anoop,
Thanx for reply...wich gridview??? i don't use a gridview. it is a datatable from sqlserver table.
|
|
|
|
|
Hi,
Something like this might do it for ya...
DataRow[] _dataRow1;
DataRow[] _dataRow2;
foreach(DataRow dr1 in whateverYouCalledThis.Rows)
{
_dataRow1 = dsYourDataSet.Tables[0].Select(“date”);
foreach(DataRow dr2 in _dataRow)
{
_dataRow2 = dsYourDataSet.Tables[0].Select(“time”);
}
this.txtDate = _dataRow2[0]["date"].ToString();
this.txtTime = _dataRow2[0]["time"].ToString();
}
I'm sure there are better ways to do this
~j
|
|
|
|
|
How can I Disable users not to view the Source Code of Javascript using Internet Explorer ->View->Source at runtime?
|
|
|
|
|
I think We cant disable..
Rajendran.AL
|
|
|
|
|
Disabling the user from viewing your source? I don't know if that is possible by a remotest way. But, you can surely obfuscate your javascript. Look at the following URL:
http://www.javascriptobfuscator.com/[^]
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
oncontextmenu="return false">
The above statement can block the right clicks on the page. Then also the browser has options to view the source. So better try encrypt HTML.
|
|
|
|
|
Hi All,
I have a button on my screen that kicks off a long background worker, if the user clicks this button again is it best practice to:
a) inform them that the process is already running in the background
b) disable the button completely
c) just perform a check, if the background worker has started do nothing, if not kick it off ...
Cheers,
Jammer
Going where everyone here has gone before!
My Blog
|
|
|
|
|
Well I think that depends entirely on your application. b) is neat but a) is more informative for stupid users (they're all stupid unless proved otherwise). c) suggests that you don't care whether your users know whether its running or has run at all.
Don't think there's a best practice as such here.
Regards,
Rob Philpott.
|
|
|
|
|