|
Just a simple bubble sort. Say you had an array of numbers ranging from 1 - 10 in any order:
do {
bool Continue;
for(int i=0; i<array.length-1; i++) {
if(array[i] > array[i+1]) {
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
Continue = true;
}
}
}while(Continue);
Of course to start at 60 and go to the end, you would just start int i at 60, rather than 0. If you have something like a string in your array, the string class has methods that compare two strings, so you'd need to check those out.
EDIT:Fixed the code, stupid <
My current favourite word is: Bauble!
-SK Genius
modified on Saturday, December 08, 2007 8:39:46 AM
|
|
|
|
|
Yes it is a string. I have been able to solve the problem by writing the array to a text file unsorted.txt and then doing a DOS sort /+60 usorted.txt > sorted.txt and reading the file back into the array but thats really messy.
I will try to implement your suggestion
TNX
|
|
|
|
|
Write a comparer for the object you are storing int the array. Several of the .NET list objects will take, as a parameter to sort, the comparer to use. In fact, even if you don't pass one the default comparer will likely use your version.
Need a C# Consultant? I'm available.
Happiness in intelligent people is the rarest thing I know. -- Ernest Hemingway
|
|
|
|
|
I have spent a whole day trying to write a comarer and make sence out of MSDN's convoluted instructions but have not been able to get something that compiles and works.
|
|
|
|
|
public class Foo : Comparer<foo> {
private string mMyString = new string('c', 100);
public override int Compare(Foo one, Foo two) {
return one.mMyString.Substring(59).CompareTo(two.mMyString.Substring(59));
}
}
Use System.Collections.Generic.List<foo> as the list.
Also, you may have to vary the code in the Compare method as I did not bother to test it.
Need a C# Consultant? I'm available.
Happiness in intelligent people is the rarest thing I know. -- Ernest Hemingway
|
|
|
|
|
A comparer is pretty simple. It's just a class with a Compare method that works like any other Compare method (like string.Compare for example).
Try this:
class SubstringComparer : IComparer<string> {
private int _offset, _len;
public SubstringComparer(int offset, int len) { _offset = offset; _len = len; }
public override int Compare(string x, string y) {
return string.Compare(x, _offset, y, _offset, _len);
}
}
Array.Sort(myArray, new SubstringComparer(59, int.MaxValue));
modified on Saturday, December 08, 2007 2:31:24 PM
|
|
|
|
|
This is my code that will not compile.
<br />
<br />
<br />
class SubstringComparer : IComparer<string> <br />
{ <br />
private int _offset, _len; <br />
public SubstringComparer(int offset, int len) <br />
{ <br />
_offset = offset; _len = len; <br />
} <br />
public override int Compare(string x, string y) <br />
{ <br />
return string.Compare(x, _offset, y, _offset, _len); <br />
}<br />
}<br />
<br />
private void button13_Click(object sender, EventArgs e)<br />
{<br />
ArrayList arraylist = new ArrayList();<br />
for (int i = 0; i < listBox1.Items.Count; i++)<br />
{<br />
string temp = listBox1.Items[i].ToString();<br />
if (temp.Length>65)<br />
{<br />
arraylist.Add(temp);<br />
}<br />
}<br />
Array.Sort(arraylist, new SubstringComparer(59, int.MaxValue));<br />
listBox1.Items.Clear();<br />
for (int i = 0; i < arraylist.Count; i++)<br />
listBox1.Items.Add(arraylist[i]);<br />
}<br />
}<br />
TNX for the help
modified on Saturday, December 08, 2007 10:45:32 AM
|
|
|
|
|
Hi George,
there are basically two ways (old and new):
1.
if you want to sort an ArrayList in a special way, you need to create an object
that implements IComparer (without < string> ) and knows how to compare
two items. Its signature MUST be public int Compare(object obj1, object obj2)
There is no override, by writing ": Icomparer" you promise to implement the formentioned method.
And you need to cast the arguments to strings explicitly, as in:
string str1=(string)obj1
2.
Starting with .NET 2.0 you can also use generic collections.
The code Guffa showed you is fine if you keep the strings in a generic list, that is
a List< string> . In that case you inherit
from IComparer< string> and your Compare method takes string
arguments directly, but still there is no override involved.
The generics stuff basically makes all the castings redundant.
Regards,
|
|
|
|
|
Is it possible that my problem is associated with the fact that I am using .NET 3.5 and Visual 2008.
|
|
|
|
|
Hi George,
I don't know for sure about 3.5/2008 since I haven't used them yet.
but there are some problems in the code you posted, as I pointed out before.
For one you should drop the "override" then choose either an ArrayList (1. in
my earlier reply) or List< string> (2) and make your Compare accordingly.
|
|
|
|
|
I haven't investigated to see if there are any new 'features' in this regard - but Generic Lists, IComparer and IComparable definately function as before and none of the 'normal' methods have changed in VS2008/.NET3.5
To be honest, so far I've had no problems coding exactly the same as I did with 2005 with all classes/interfaces etc.
|
|
|
|
|
I have found also that all my old code could migrate without problem.
|
|
|
|
|
Oh, you are not using an array at all, but an ArrayList. That's a big difference.
Then you need a comparer that handles objects:
class SubstringComparer : IComparer {
private int _offset, _len;
public SubstringComparer(int offset, int len) {
_offset = offset; _len = len;
}
public override int Compare(object x, object y) {
return string.Compare((string)x, _offset, (string)y, _offset, _len);
}
}
And use it like this:
arraylist.Sort(new SubstringComparer(59, int.MaxValue));
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
Still will not compile
class SubstringComparer : IComparer
{
private int _offset, _len;
public SubstringComparer(int offset, int len)
{
_offset = offset; _len = len;
}
public override int Compare(object x, object y)
{
return string.Compare((string)x, _offset, (string)y, _offset, _len);
}
}
private void button13_Click(object sender, EventArgs e)
{
ArrayList arraylist = new ArrayList();
for (int i = 0; i < listBox1.Items.Count; i++)
{
string temp = listBox1.Items[i].ToString();
if (temp.Length>65)
{
arraylist.Add(temp);
}
}
arraylist.Sort(new SubstringComparer(59, int.MaxValue));
listBox1.Items.Clear();
for (int i = 0; i < arraylist.Count; i++)
listBox1.Items.Add(arraylist[i]);
}
|
|
|
|
|
Silly me... It's an interface, so you don't override the methods. Just remove the override keyword.
Experience is the sum of all the mistakes you have done.
modified on Monday, December 10, 2007 7:05:57 PM
|
|
|
|
|
Guffa
Many thanks for your help and persistence sticking with me until the code was working. I have now implemented the methods you suggested in numerous programs and it has proven a valuable addition.
Thanks Again
|
|
|
|
|
hye,
I m Using USB webcam in my project to take live video. If, accidently, I unplug the camera while its grabbing live video frames, my system restarts.
I have searched but cant find its solution so far.
So plz can any1 tell me how can i fix this problem ?
B!z
|
|
|
|
|
Is it your program that causes windows to restart? Or something else?
My current favourite word is: Bauble!
-SK Genius
|
|
|
|
|
no its my programme that causes System to restart.
and now i m going to look at this proj:http://www.codeproject.com/cs/system/DriveDetector.asp[^]
for further help.
Regards.
B!z
|
|
|
|
|
|
Ok thx. i'll check it !
B!z
|
|
|
|
|
Hi.
I got a very simple question.
I'm trying to ensamble a string with some texts and CRLF on it. The question is how could I add these CRLF? I mean, ie in VB there are constants like vbCrlf and vbTab and you can write: string1 + vbCrlf + string2 + vbTab + string3.... and so on.
Where could I find these kind of constants in C#? or what should I write instead?
Thankx very much.
Demian.
"I have always wished that my computer would be as easy to use as my
telephone. My wish has come true. I no longer know how to use my telephone."
-Bjarne Stroustrup, computer science professor, designer of C++
programming language (1950- )
|
|
|
|
|
Hi,
in C-like languages (C, C++, Java, C#) there are escapes for special characters,
such as \r for CR, \n for LF, \t for TAB, \\ for BACKSLASH.
So you can write things such as "line 1\r\nline2" .
If however you want to generate a platform-dependent "go to the next line" (for
.NET versions on different hardware/OS combinations), then
"line 1"+Environment.NewLine+"line 2" is the right choice.
If you are new to C# (or any other programming language) I would suggest you buy
a book on it and work your way through it, that's the easiest way to learn the basics.
|
|
|
|
|
Oh yes , of course is like C. I did'nt tried that.
I was thinking in a VB way, instead of a C way.
Thank you very much.
Demian.
"I have always wished that my computer would be as easy to use as my
telephone. My wish has come true. I no longer know how to use my telephone."
-Bjarne Stroustrup, computer science professor, designer of C++
programming language (1950- )
|
|
|
|
|
I've made a web folder in Windows XP named as localhost but it doesn't have files and folders. Can anybody help me?
|
|
|
|