Page 1 of 2 in the Codesnippet category Next Page
String.Join concatenates an array of strings together without checking for empty entries. This means the separator character is added twice, between non-empty items sometimes. String[] input = {foo, null, bar};
var result = String.Join(",", input);
// result == "foo,,bar"
My alternative uses the IEnumerable.Aggregate extension method, it checks for there empty entries and when it finds one doesn't add a redundant separator.
string[] input = { "foo", null, "bar" };
string result = input.Aggregate((x, y) => String.IsNullOrEmpty(y) ? x : string.Concat(x, ",", y));
// result == "foo,bar"
Although generally a bad idea [0], there is another problem. The System.Web.Caching.Cache doesn't call dispose on the items removed from the cache, causing a resource leak. To prevent this resource leak, add a CacheItemRemovedCallback in which you dispose of the object.
// add the item to the cache, note the callback
HttpRuntime.Cache.Add("myKey", myClass, null, DateTime.Now.AddSeconds(5),
Cache.NoSlidingExpiration, CacheItemPriority.Default,
new CacheItemRemovedCallback( OnRemoved ) );
// callback function
void OnRemoved( string key, object value, CacheItemRemovedReason reason ) {
IDisposable disposable = value as IDisposable;
if (disposable != null) {
disposable.Dispose();
}
}
[0] Should you really be caching an object containing unmanaged resources, which usually are scarce?
public class A { public virtual void AA(){} }
public abstract class B : A{ public abstract override void AA(); }
If you now would define a class C : B, then C must implement the method AA again.
The best new feature in iTunes 7 is the cover art browser, the not so good feature is the fact that it doesn't work so good on Windows Vista. So after moving back to Mediaplayer and missing the cover art, which takes forever to download for a decent sized library in iTunes. I put together this codesnippet, which lets downloads the cover art from the iTunes store for the specified artist/album.
The interesting part is the headers you have to send with your request:
request.Headers.Add("X-Apple-Tz", "7200"); request.Headers.Add("X-Apple-Store-Front", "143457"); request.Headers.Add("Accept-Language", "en-us, en;q=0.50"); request.Headers.Add("Accept-Encoding", "gzip, x-aes-cbc"); request.UserAgent = "iTunes/7.0 (Macintosh; U; PPC Mac OS X 10.4.7)"; request.AutomaticDecompression = DecompressionMethods.GZip;
Also note that the HttpWebRequest class automatically decompresses the response.
Program.cs (3.44 KB)Program.txt (3.44 KB)
Note: this code is based on the perl library by Jesper Nøhr and works as long as Apple doesn't change anything.
Well, maybe...
public class GenericComparer : IComparer {
public GenericComparer( CompareDelegate doCompare ){
if( doCompare == null ){
throw new ArgumentNullException("doCompare");
}
this.doCompare = doCompare;
}
public int Compare( object x, object y ){
if( x == null ){
if( y == null ){
return 0;
}
return -1;
}
if( y == null ){
return 1;
}
return doCompare(x,y);
}
private CompareDelegate doCompare;
}
public delegate int CompareDelegate( object x, object y );
Update: My colleague Branimir did a little experimentation and found this implementation is similar in performance to a 'regular' methodcall when sorting around 10.000 items. LastComparer.zip (30.65 KB)
Code to create a random validationKey and decryption for use in the machinekey element of the web.config.
Note: valid values for the decryptionKey length are 8 (for DES) or 24 (for 3DES), the resulting key is twice as long and for validationkey 20 to 64.
using System;
using System.Text;
using System.Security.Cryptography;
namespace Crypto {
public class KeyCreator {
public static void Main(String[] args) {
String[] commandLineArgs = System.Environment.GetCommandLineArgs();
string decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1]));
string validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2]));
Console.WriteLine("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>", validationKey, decryptionKey);
}
static String CreateKey(int numBytes) {
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[numBytes];
rng.GetBytes(buff);
return BytesToHexString(buff);
}
static String BytesToHexString(byte[] bytes) {
StringBuilder hexString = new StringBuilder(64);
for (int counter = 0; counter < bytes.Length; counter++) {
hexString.Append( String.Format("{0:X2}", bytes[counter]));
}
return hexString.ToString();
}
}
}
source: mskb312906
<? xml version="1.0" encoding="utf-8" ?>
< CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
< CodeSnippet Format="1.0.0">
< Header>
< Title>sourcesafe header</Title>
< Shortcut>header</Shortcut>
< Description>Code snippet for sourcesafe header.</Description>
< Author>Paul van Brenk</Author>
< SnippetTypes>
< SnippetType>Expansion</SnippetType>
</ SnippetTypes>
</ Header>
< Snippet>
< Declarations>
< Literal />
</ Declarations>
< Code Language="csharp" Kind="file" Delimiter="*">
<![CDATA[ #region SourceSafe header
// $Author: $
// $Modtime: $
// $Workfile: $
// $Revision: 1 $
#endregion
*end* ]]>
</ Code>
</ Snippet>
</ CodeSnippet>
</ CodeSnippets>
File Attachment: sourcesafe_header.zip (550 bytes)
Update: Still haven't found what is causing the exception, but I think the message of the exception is incorrect. For now I'm sticking with the Knuth Shuffle algorithm from the PowerCollections. As suggested by Cyrus.
int[] ints = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
System.Random rand = new System.Random((int)DateTime.Now.Ticks);
Array.Sort(ints, delegate(int x, int y){
// since you’re not allowed to return anything else than 0 for x.CompareTo(x)
if
(x == y) {
return 0;
}
return rand.Next(-1,2);
}
);
note: This still throws an exception sometimes, claiming x.CompareTo(x) didn't return 0. I haven't found out why this happens or a pattern when this is happening, but I'll keep looking.
public static string GeneratePassword(int length) {
string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?";
Random rnd = new Random( (int)DateTime.Now.Ticks ); char[] chars = new char[length];
for(int i = 0;i<length;i++) { chars[i] = allowedChars[ rnd.Next( allowedChars.Length ) ]; }
return new string(chars); }
When running in a tight loop, you're better of pulling the initialisation of the randomGenerator outside the method, or not use DateTime.Now.TickCount as the seed.
The easiest way on sql server 2000 is to change the collation on the column you want to do the search on:
ALTER TABLE dbo.Customers ALTER COLUMN CustID char(8) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL
|