Facepalm of the day.
-
So I was building an application that presents a list of files matched with info in a database. Everything was working fine and dandy but horrendously slow. I quickly found the culprit to be in this function:
Func GetIDPart_Of_FileName = FileName => Convert.ToInt32(FileName.Substring(FileName.IndexOf('_') + 1, FileName.IndexOf('.') - FileName.IndexOf('_')));
The files are built in the form of ID_AnotherID.Extension and what I wanted was AnotherID Can anyone see what I did wrong? :) Do note that it was giving correct results. fixed typo
Wrong is evil and must be defeated. - Jeff Ello[^]
-
So I was building an application that presents a list of files matched with info in a database. Everything was working fine and dandy but horrendously slow. I quickly found the culprit to be in this function:
Func GetIDPart_Of_FileName = FileName => Convert.ToInt32(FileName.Substring(FileName.IndexOf('_') + 1, FileName.IndexOf('.') - FileName.IndexOf('_')));
The files are built in the form of ID_AnotherID.Extension and what I wanted was AnotherID Can anyone see what I did wrong? :) Do note that it was giving correct results. fixed typo
Wrong is evil and must be defeated. - Jeff Ello[^]
-
So I was building an application that presents a list of files matched with info in a database. Everything was working fine and dandy but horrendously slow. I quickly found the culprit to be in this function:
Func GetIDPart_Of_FileName = FileName => Convert.ToInt32(FileName.Substring(FileName.IndexOf('_') + 1, FileName.IndexOf('.') - FileName.IndexOf('_')));
The files are built in the form of ID_AnotherID.Extension and what I wanted was AnotherID Can anyone see what I did wrong? :) Do note that it was giving correct results. fixed typo
Wrong is evil and must be defeated. - Jeff Ello[^]
Regex should be your friend. Edit:
string filename = "123\_456.txt" ; System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex ( @"^(?'ID0'\\d+)\_(?'ID1'\\d+)\\.(?'Ext'.+)$" ) ; int id = System.Int32.Parse ( reg.Matches ( filename ) \[ 0 \].Groups \[ "ID1" \].Value ) ;
-
Regex should be your friend. Edit:
string filename = "123\_456.txt" ; System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex ( @"^(?'ID0'\\d+)\_(?'ID1'\\d+)\\.(?'Ext'.+)$" ) ; int id = System.Int32.Parse ( reg.Matches ( filename ) \[ 0 \].Groups \[ "ID1" \].Value ) ;
You'd think so, wouldn't you? Surprisingly, that turns out not to be the case... Counting Lines in a String[^]
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
-
You'd think so, wouldn't you? Surprisingly, that turns out not to be the case... Counting Lines in a String[^]
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
I know. :sigh:
-
Regex should be your friend. Edit:
string filename = "123\_456.txt" ; System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex ( @"^(?'ID0'\\d+)\_(?'ID1'\\d+)\\.(?'Ext'.+)$" ) ; int id = System.Int32.Parse ( reg.Matches ( filename ) \[ 0 \].Groups \[ "ID1" \].Value ) ;
I'm noticing your wording my friend.
Wrong is evil and must be defeated. - Jeff Ello[^]
-
So I was building an application that presents a list of files matched with info in a database. Everything was working fine and dandy but horrendously slow. I quickly found the culprit to be in this function:
Func GetIDPart_Of_FileName = FileName => Convert.ToInt32(FileName.Substring(FileName.IndexOf('_') + 1, FileName.IndexOf('.') - FileName.IndexOf('_')));
The files are built in the form of ID_AnotherID.Extension and what I wanted was AnotherID Can anyone see what I did wrong? :) Do note that it was giving correct results. fixed typo
Wrong is evil and must be defeated. - Jeff Ello[^]
-
Your length is off by one. The decimal point is included. I prefer int.TryParse over Convert.
And we have a winner. Amazing that the decimal point is making the conversion more than 3000 times slower. But since it didn't throw an exception but rather make a correct conversion I actually doubt that TryParse would have made a difference.
Wrong is evil and must be defeated. - Jeff Ello[^]
-
And we have a winner. Amazing that the decimal point is making the conversion more than 3000 times slower. But since it didn't throw an exception but rather make a correct conversion I actually doubt that TryParse would have made a difference.
Wrong is evil and must be defeated. - Jeff Ello[^]
Jörgen Andersson wrote:
doubt that TryParse would have made a difference.
Fewer puppies would have been killed. Don't use Convert.
-
Jörgen Andersson wrote:
doubt that TryParse would have made a difference.
Fewer puppies would have been killed. Don't use Convert.
If I don't expect the conversion to fail I want an exception. When failure is expected I use TryParse. There is a reason both exists.
Wrong is evil and must be defeated. - Jeff Ello[^]
-
If I don't expect the conversion to fail I want an exception. When failure is expected I use TryParse. There is a reason both exists.
Wrong is evil and must be defeated. - Jeff Ello[^]
Yes, in this case Parse is more appropriate. (I just updated my earlier response with an example.)
-
And we have a winner. Amazing that the decimal point is making the conversion more than 3000 times slower. But since it didn't throw an exception but rather make a correct conversion I actually doubt that TryParse would have made a difference.
Wrong is evil and must be defeated. - Jeff Ello[^]
Jörgen Andersson wrote:
But since it didn't throw an exception but rather make a correct conversion
What version of .NET? I've just tried
Convert.ToInt32("42.")
in LINQPad for 3.5 and 4.5, and both versions throw aFormatException
.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Your length is off by one. The decimal point is included. I prefer int.TryParse over Convert.
That slows it down? I spotted that right away, about 15 mins after he posted, but figured it'd be irrelevant, so didn't post. So a trailing decimal has that much of an effect... Good to know.
Proud to have finally moved to the A-Ark. Which one are you in?
Author of the Guardians Saga (Sci-Fi/Fantasy novels) -
And we have a winner. Amazing that the decimal point is making the conversion more than 3000 times slower. But since it didn't throw an exception but rather make a correct conversion I actually doubt that TryParse would have made a difference.
Wrong is evil and must be defeated. - Jeff Ello[^]
3000 times slower? I noticed the extra character about 15 mins after you started this thread, but didn't think it relevant. I'll have to keep an eye out for that... Almost as bad as the exponent operator in VB.NET... (Try benchmarking 2^2 vs Math.Pow(2,2))
Proud to have finally moved to the A-Ark. Which one are you in?
Author of the Guardians Saga (Sci-Fi/Fantasy novels) -
Jörgen Andersson wrote:
But since it didn't throw an exception but rather make a correct conversion
What version of .NET? I've just tried
Convert.ToInt32("42.")
in LINQPad for 3.5 and 4.5, and both versions throw aFormatException
.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
4.5
Wrong is evil and must be defeated. - Jeff Ello[^]
-
4.5
Wrong is evil and must be defeated. - Jeff Ello[^]
Weird. If I try
Convert.ToInt32("42.")
in .NET 4.5, I get:FormatException: Input string was not in a correct format.
Are you sure you're not doing something else in your code that's hiding the error?
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Weird. If I try
Convert.ToInt32("42.")
in .NET 4.5, I get:FormatException: Input string was not in a correct format.
Are you sure you're not doing something else in your code that's hiding the error?
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Odd, I'have to check on monday when I'm back at work.
Wrong is evil and must be defeated. - Jeff Ello[^]
-
Weird. If I try
Convert.ToInt32("42.")
in .NET 4.5, I get:FormatException: Input string was not in a correct format.
Are you sure you're not doing something else in your code that's hiding the error?
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Jörgen Andersson (is this you "Neo"?!?) sounds scandinavian and they probably have a different decimal separator... Robert
-
Jörgen Andersson (is this you "Neo"?!?) sounds scandinavian and they probably have a different decimal separator... Robert
Good point. However,
Convert.ToInt32("42,")
still produces aFormatException
. Trying "42." with the "sv-SE" culture, which uses "," as the decimal separator and "." as the group separator, also produces aFormatException
.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
So I was building an application that presents a list of files matched with info in a database. Everything was working fine and dandy but horrendously slow. I quickly found the culprit to be in this function:
Func GetIDPart_Of_FileName = FileName => Convert.ToInt32(FileName.Substring(FileName.IndexOf('_') + 1, FileName.IndexOf('.') - FileName.IndexOf('_')));
The files are built in the form of ID_AnotherID.Extension and what I wanted was AnotherID Can anyone see what I did wrong? :) Do note that it was giving correct results. fixed typo
Wrong is evil and must be defeated. - Jeff Ello[^]
hmm FileName.IndexOf('_') is calculated twice too