|
Thanks for that.
As you said, the code is for the latest version of C# and I am using 2005. I came up with this that seems to do the job
public static string CVNameSearch(string inputStr)
{
int x;
string returnStr;
returnStr = "";
for (x = 0; x<= inputStr.Length -1; ++x)
{
if (char.IsLetter(inputStr, x))
{
returnStr += inputStr.Substring(x, 1).ToUpper();
}
}
return returnStr;
}
Thanks for your help today
The FoZ
|
|
|
|
|
Why not something simple, like this?
str = Regex.Replace(str, "[^A-Za-z]+", string.Empty).ToUpper();
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Nice cheers.
Don't suppose you could explain the syntax for me. I gather from the help that str is the input string, "[^A-Za-z]+" is the match but I'm not sure how it works. What is the string.Empty for?
Thanks for your help
The FoZ
|
|
|
|
|
[^A-Za-z]+<br /> Basically this is a regular expression pattern which matches:
[^]+ ==> any character that is not included inside the brackets
A-Z ==> matches any character in the range A to Z
a-z ==> matches any character in the range a to z
So basically it replaces an non-alphabetic character with string.Empty . string.Empty (or String.Empty or System.String.Empty ) are essentially the same as "" however when you reference them it does not create a new object but utilises one that's already been created, thus more memory efficient. A small difference but sometimes it matters.
|
|
|
|
|
Ed.Poore wrote: string.Empty (or String.Empty or System.String.Empty) are essentially the same as "" however when you reference them it does not create a new object but utilises one that's already been created, thus more memory efficient. A small difference but sometimes it matters.
The performance difference is really minimal, but there is another difference.
If you always use string.Empty when you want an empty string, the code gets clearer. If you happen to stumble upon a "" in the code, you know that there is supposed to be something between the quotation marks, that perhaps got erased or left out by mistake.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
That's the best justification I've heard of it, thanks! I do use it but had always been slightly confused as to what the point was, now there's a valid reason.
|
|
|
|
|
Another benefit is that it ensures the comparisons are always performed the same way...no more some tests looking for length == 0 while others looking for "".
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
[ Forum Guidelines][ Articles][ Blog]
|
|
|
|
|
Excellent reasons. Another benefit is that it ensures the comparisons are always performed the same way...no more some tests looking for length == 0 while others looking for "".
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
[ Forum Guidelines][ Articles][ Blog]
|
|
|
|
|
Ed.Poore wrote: does not create a new object but utilises one that's already been created
But in either case it stores an empty string in the executable at that point, because it's a constant, right?
If so, there's no difference.
|
|
|
|
|
No it doesn't, I just compiled a sample and took a look at it under reflector and they definitely use two different methods, one compares a constant, the other compares the reference:
.entrypoint
.maxstack 2
.locals init (
[0] string toCompare,
[1] bool c1,
[2] bool c2)
L_0000: nop
L_0001: ldstr "Hello"
L_0006: stloc.0
L_0007: ldloc.0
<span style="color: Red;">L_0008: ldsfld string [mscorlib]System.String::Empty</span><br style="color: Red;"><span style="color: Red;">L_000d: call bool [mscorlib]System.String::op_Equality(string, string)</span>
L_0012: stloc.1
L_0013: ldloc.0
<span style="color: Green;">L_0014: ldstr ""</span><br style="color: Green;"><span style="color: Green;">L_0019: call bool [mscorlib]System.String::op_Equality(string, string)</span>
L_001e: stloc.2
L_001f: ret</br></br>
|
|
|
|
|
PIEBALDconsult wrote: But in either case it stores an empty string in the executable at that point, because it's a constant, right?
If so, there's no difference.
No, the string.Empty property returns a string that already exists in the mscorlib.dll. If you use "", that literal string will be added to your assembly.
The difference is minimal, as it's only a few bytes of data, but there is a difference.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks for the info. 'Every little helps' when it all comes down to it. The Regex expression does exactly what the old VB code does in about 10 lines and lots of iterations through a loop.
The FoZ
|
|
|
|
|
It all depends on whether you understand (and like) regular expressions. Some people will do anything to avoid them.
I doubt it. If it isn't intuitive then we need to fix it. - Chris Maunder
|
|
|
|
|
The pattern "[^A-Za-z]+" matches any non-letter characters, which then are replaced by an empty string, so that any non-letter characters are removed from the string. The ^ in the set makes it a negative set, mathing any characters except A-Z and a-z.
If you want to keep any other characters, you just add them in the pattern, like for example "[^A-Za-zÅåÄäÖöÉéÈèËëÑñ]+".
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
In C# you would use a bunch of if(c == foo) .... else if(30 < c && c < 100 && c == 10) ... etc.
Of course with your particular issue doing it character by character probably isnt the best solution. I'd avoid using a Regex for something so simple. The framework has a bunch of stuff here thats probably useful (and culture invariant), eg: "foo bar".ToUpper().Replace(" ","") or similar.
And who suggested LINQ? Just because LINQ is cool doesnt mean its appropriate to use it
|
|
|
|
|
So I've been trying to create a screen saver where the contents of a file will be read and displayed on the screen - but not having much success.
I want the text to appear one character at a time (like a typewriter) but the problem is the flicker! I've tried labels, multi-line textboxes and richtextboxes and they all have ridiculous amounts of flicker. Labels are better if I don't set the FlatStyle to System but then I can't see the tabs, so I don't want that.
Another issue is I'm not able to scroll along with the text as it progresses down the control. I tried the ScrollToCaret trick and that works but first it has to jump to the start of the control which causes another undesirable effect.
Here's the method that does the typewriter thing:
public void TW()
{
try
{
char[] myChars = msg.ToCharArray();
lbl.Text = "";
for(int i = 0; i < myChars.Length; i++)
{
lbl.Text += myChars[i].ToString();
System.Threading.Thread.Sleep(0);
}
}
catch(Exception)
{
}
}
|
|
|
|
|
Have you tried GDI+ and/or direct draw
-Spacix
All your skynet questions[ ^] belong to solved
I dislike the black-and-white voting system on questions/answers.
|
|
|
|
|
No I haven't. I think once I made a triangle in some tutorial somewhere, but that's it. Would this work for text pulled from a file?
|
|
|
|
|
yep, you can read the text into a string and load string builder then draw is one char at a time, or any other goodies you wish to manipulate it with.
-Spacix
All your skynet questions[ ^] belong to solved
I dislike the black-and-white voting system on questions/answers.
|
|
|
|
|
Well the GDI+ suggestion works great!! No flicker and it looks very nice. Now I'm wondering how I clear the screen and "tele-type" some more text.
The graphics object I'm using comes from the main form's CreateGraphics method. I have no idea if this is ideal or not (probably not) but I'm not sure how I could clear the form once the bottom of the screen is reached and continue from the top with the remainder of the text.
Part of the problem might be that the method used to write my text is in another thread.
|
|
|
|
|
Never mind - I got it. After the text has finished I just call the graphic's FillRectangle() method and fill it with the background color.
Also, while the text is printing I test the height of the VisibleClipBounds and if my text has grown too big then I clear the screen and continue typing:
while(true)
{
string result = "";
for(int i = 0; i < characters.Length; i++)
{
result += characters[i].ToString();
gfx.DrawString(result, lucindaFont, green, 10, 10);
Thread.Sleep(1);
SizeF size = gfx.MeasureString(result, lucindaFont);
if(gfx.VisibleClipBounds.Size.Height < size.Height)
{
gfx.FillRectangle(black, gfx.VisibleClipBounds);
result = "";
}
}
gfx.FillRectangle(black, gfx.VisibleClipBounds);
}
|
|
|
|
|
Hey everyone,
I have recently built a client and server application for transferring files across the network. The client application uses two threads: one for transferring file data to the server and another for monitoring incoming messages from the server. Both threads use separate NetworkStream objects for their respewctive tasks.
The job of the listener thread is to listen for messages from the server (which are in the from of strings). Now, when the server disconnects for whatever reason, it'll send a "Disconnect" string message to the client. The listener thread will receive that message, interpret it, and then tell the client application to disconnect from the server.
to illustrate what I mean, here is some code from my client:
//the thread monitoring incoming messages from the server
private Thread m_oListenerThread;
//the thread in charge of file transfer
private Thread m_oTransferThread;
//when 'true', the listener thread exits its loop and terminates
private volatile bool m_bListenerStop;
//when 'true', the transfer thread exits its loop and terminates
private volatile bool m_bTransferThreadStop;
//here is the method run by the listener thread:
StartListening()
{
//some initialization details here
//...
while(m_bListenerStop)
{
//check the NetworkStream object for any data
//...
//if data available, extract string from NetworkStream
//...
//parse message (where sMessage is the extracted string message)
HandleCommand(sMessage);
}
//thread termination details
//...
}
HandleCommand(string z_sMessage)
{
if (z_sMessage == "Disconnect")
{
DisconnectFromServer();
}
}
This is simple enough, but in order to make the application more robust, I need to ensure that all threads have terminated. The only way I know of so far is to call Join(nMiliseconds) on the thread which you want to test. This will cause the calling thread (ex: main) to wait for the thread until nMiliseconds has expired, or the thread is no longer active. Therefore, the DisconnectFromServer() method would look something like this:
DisconnectFromServer()
{
//signal threads to terminate
m_bListenerStop = true;
m_bTransferThreadStop = true;
//close all connection elements
//...
//ensure all threads have stopped
if (m_oListenerThread != null)
{
UpdateStatusDisplay("Waiting for listener thread to terminate...");
//wait for 302 milliseconds for listener thread to terminate. If the thread has not terminated
//by that time, abort thread and throw an exception.
if (m_oListenerThread.Join(302) == false)
{
m_oListenerThread.Abort();
}
if (m_oTransferThread != null)
{
//wait 20 ms for transfer thread to terminate. If the thread has not terminated by that time, abort thread and throw exception.
if (m_oTransferThread.Join(20) == false)
{
m_oTransferThread.Abort();
}
}
//some other termination logic
//...
}
so when x miliseconds has expired and the given thread is not terminated, Abort() is called on the thread to force it to shut down. The problem with the following is that when DisconnectFromServer is called by the listener thread (via HandleCommand()), the thread waits for the function to return so it may keep going and eventually exit its while loop. But it can never do this since DisconnectFromServer() will make it block (due to Join()). The thread is therefore stuck waiting for itself. When the time expires, it simply shuts itself down (using Abort()), and the function never returns, just abruptly stops.
This simply won't do! I have tried using an event in the hopes that the thread would fire a 'shutdown' event, and keep going while the main thread handles the event by calling DisconnectFromServer(), but the same problem arose: the thread waits for the event handler to return.
In short, is there a way to fire events or call methods without being forced to wait for those to return?
Or am I forced to create a third thread which would handle the shutdown procedure? Of course, if I do the latter, I won't really have any means to use Join() on that shutdown thread to make sure it terminated...
|
|
|
|
|
Hi
As you may be able to tell I am a bit new to C# and I may be attacking this from the wrong angle.
I would like to create global function for the program I am writing. I would like to group these functions together for ease i.e. Customer related functions, general function but enable them to be used by other bits of code. I can do this fine in VB.NET but cannot get them to work in C#.
For Example I would like a function that returns a string that is stripped of all punctuation and is in upper case. This would be a general function and I would like it in its own code file so I can group it together with other ones.
I've had a look in my book and cannot find anything that helps. Is this more of a VB thing and is done differently in C# or am I missing something.
ps I'm using C# 2005 Express Edition.
Many Thanks
The FoZ
|
|
|
|
|
Customer-related functions should be instance methods on the Customer class.
For things that don't require an instance, make them static. For example,
public class MyGlobalFuncs
{
public static void Foo() { }
} That can be invoked like this: MyGlobalFuncs.Foo()
Life, family, faith: Give me a visit.
From my latest post: "A lot of Christians struggle, perhaps at a subconscious level, about the phrase "God of Israel". After all, Israel's God is the God of Judaism, is He not? And the God of Christianity is not the God of Judaism, right?"
Judah Himango
|
|
|
|
|
Thanks for that. Its so easy when you know how!
Thanks again.
The FoZ
|
|
|
|
|