public static class ArrayAppender { public static TYPE[] Append(this TYPE[] b1, TYPE[] b2) { TYPE[] newArray = new TYPE[b1.Length + b2.Length]; Array.Copy(b1, 0, newArray, 0, b1.Length); Array.Copy(b2, 0, newArray, b1.Length, b2.Length); return newArray; } } internal class ArrayAppendTester { public void Test() { int[] intArray1 = new int[4] { 42, 7, 6, 3 }; int[] intArray2 = new int[7] { 1, 2, 3, 4, 5, 6, 7}; int[] newArray = ArrayAppender.Append (intArray1, intArray2); int[] newArray2 = intArray1.Append(intArray2); } }
August 30, 2005
c# Array Append Pattern
Pattern to append one array to the end of another in c#
Format of an c# Indexer
Indexer format:
class XXX { // RETURN_TYPE is type that is returned by the indexer // INDEX_TYPE is the indexer look up type public RETURN_TYPE this[INDEX_TYPE index] { get{return ...;} set{... = value;} }Note that their can be multiple indexers
public RETURN_TYPE this[INDEX_TYPE_1 index1, ..., INDEX_TYPE_N indexN] { get{ ... } set{ ... } }
Equals Operator Pattern
Equality in C#
Pattern for implementing required operators to support '==', '!=', 'Equals()' and 'GetHashCode()' for a new reference or value type. Need to implement these methods together.
public override bool Equals(object rhs) { if (rhs == null) // this cannot be null return false; if (object.ReferenceEquals(this, rhs) return true; // Check for null values and compare run-time types. if (this.GetType() != rhs.GetType()) return false; return CompareFields(rhs as XXX); } private bool CompareFields(XXX p) { // Field by field comparison return (this.field1 == this.field2) && ...; } public override int GetHashCode() { // Aim to get a unique number from the objects state int tmp = ((int)(field1 << 16) + field2) ... ; return tmp; }In general it is not recommended to override the '==' and '!=' operators for reference types. They should only be overriden for immutable types. However here is a suitable implementation:
public static bool operator ==(XXX obj1, XXX obj2) { // IF obj1 is null // so obj2 must be for equality // ELSE obj1 is not null, // compare it with obj2 using above Equals() operator if (ReferenceEquals(obj1, null)) return ReferenceEquals(obj2, null); else return obj1.Equals(obj2); } public static bool operator !=(XXX obj1, XXX obj2) { return !(obj1 == obj2); }For VALUE types
public override bool Equals(object rhs) { if (rhs == null) // this cannot be null return false; return Equals(rhs as XXX); } public override bool Equals(XXX rhs) { return CompareFields(rhs); } private bool CompareFields(XXX p) { // Field by field comparison return (this.field1 == this.field2) && ...; } public override int GetHashCode() { // Aim to get a unique number from the objects state int tmp = ((int)(field1 << 16) + field2) ... ; return tmp; } // For VALUE types public static bool operator ==(XXX lhs, XXX rhs) { bool res = lhs.Equals(rhs); return res; } public static bool operator !=(XXX lhs, XXX rhs) { return !(lhs==rhs); }
Here is a Unit Test To Test the Equals operator Create 'x', 'y' and 'z' that are the same and an object 'a' that is not
TestEqualsOperator() { // Ensure all the XXX objects have the same constructor // except the one called 'different' XXX a = new XXX(...); XXX x = new XXX(...); XXX y = new XXX(...); XXX z = new XXX(...); XXX different = new XXX(...); Debug.Assert(x.Equals(x) == true); Debug.Assert(x.Equals(y) == y.Equals(x)); Debug.Assert((x.Equals(y) && y.Equals(z)) && x.Equals(z)); Debug.Assert(x.Equals(null) == false); Debug.Assert(a.Equals(different) == false); Debug.Assert(different.Equals(a) == false); Debug.Assert(x.Equals(different) == false); Debug.Assert(different.Equals(x) == false); Debug.Assert(y.Equals(different) == false); Debug.Assert(different.Equals(y) == false); Debug.Assert(z.Equals(different) == false); Debug.Assert(different.Equals(z) == false); }
August 18, 2005
My Testing Of DateTime Parsing Capabilities
public static void TestDateTime() { TestDateParsing(DateTime.Today.ToString()); TestDateParsing("16/08/2005"); TestDateParsing("01-08-2005"); TestDateParsing("25 December 2005"); TestDateParsing(""); TestDateParsing("YES"); /* Test with: '18/08/2005 00:00:00' '18/08/2005' Difference in days from today: 0 Test with: '16/08/2005' '16/08/2005' Difference in days from today: 2 Date is WITHIN the last '21' days Test with: '01-08-2005' '01/08/2005' Difference in days from today: 17 Date is WITHIN the last '21' days Test with: '25 December 2005' '25/12/2005' Difference in days from today: -128 Test with: '' Exception caught: 'String was not recognized as a valid DateTime.'To parse the string "Mon, 08 Apr 2013 09:56:56 +0100" had to use the parse format "ddd, dd MMM yyyy HH':'mm':'ss K"
setting dat e to Minimum Value '01/01/0001' Difference in days from today: 732175 Test with: 'YES' Exception caught: 'The string was not recognized as a valid
DateTime. There i s a unknown word starting at index 0.' setting date to Minimum
Value '01/01/0001' Difference in days from today: 732175 */ } public static void TestDateParsing(string str) { DateTime date; try { WL(string.Concat("Test with: \'", str, "\'")); date = DateTime.Parse(str); } catch (Exception ex) { WL(string.Concat(" Exception caught: \'",ex.Message, "\'
setting date to Minimum Value")); date = DateTime.MinValue; } WL(string.Concat(" \'", date.ToString("dd/MM/yyyy"), "\'")); TimeSpan time = DateTime.Now.Subtract(date); WL(string.Concat(" Difference in days from today: ",time.Days)); const int DAYLIMIT = 21; if ((time.Days <= DAYLIMIT) && (time.Days > 0)) { WL(string.Concat(" Date is WITHIN the last \'", DAYLIMIT,
"\' days")); } }
Like so:
string form = @"ddd, dd MMM yyyy HH':'mm':'ss K"; DateTime.TryParseExact(pubDateNode.Value, form, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.AssumeLocal, out when);
Subscribe to:
Posts (Atom)