Friday, October 26, 2012

delegate

 srinivas.gavidi@gmail.com

Gavidi Srinivas   08886174458 09393087430


New developers often ask me about C# delegate, as they got a bit confused about the basic concept and specially maximum of the reference contains and discussed from an advanced view. Well I think delegate is really simple, when you grab it's basic idea.
So what is delegate?
Basically it is similar like the old "C" age function pointer, where functions can be assigned like a variable and called in the run time based on dynamic conditions. C# delegate is the smarter version of function pointer which helps software architects a lot, specially while utilizing design patterns.
At first, a delegate is defined with a specific signature (return type, parameter type and order etc). To invoke a delegate object, one or more methods are required with the EXACT same signature. A delegate object is first created similar like a class object created. The delegate object will basically hold a reference of a function. The function will then can be called via the delegate object.
Sounds easy? If not lets have a look in the code snippets below.
 1. Defining the delegate
 
public delegate int Calculate (int value1, int value2);
 2. Creating methods which will be assigned to delegate object
 
//a method, that will be assigned to delegate objects
//having the EXACT signature of the delegatepublic int add(int value1, int value2)
{
    return value1 + value2;            
}//a method, that will be assigned to delegate objects
//having the EXACT signature of the delegatepublic int sub( int value1, int value2)
{
    return value1 - value2;            
}
 3. Creating the delegate object and assigning methods to those delegate objects
 
//creating the class which contains the methods 
//that will be assigned to delegate objectsMyClass mc = new MyClass();
//creating delegate objects and assigning appropriate methods
//having the EXACT signature of the delegateCalculate add = new Calculate(mc.add);
Calculate sub = new Calculate(mc.sub);
 4. Calling the methods via delegate objects
 
//using the delegate objects to call the assigned methods Console.WriteLine("Adding two values: " + add(10, 6));
Console.WriteLine("Subtracting two values: " + sub(10,4));

Saturday, October 20, 2012

Joins


 srinivas.gavidi@gmail.com

Gavidi Srinivas   08886174458 09393087430


SQL SERVER – Introduction to JOINs – Basic of JOINs

The launch of Gandhinagar SQL Server User Group was a tremendous, astonishing success! It was overwhelming to see a large gathering of enthusiasts looking up to me (I was the Key Speaker) eager to enhance their knowledge and participate in some brainstorming discussions. Some members of User Group had requested me to write a simple article on JOINS elucidating its different types.
Download SQL Script used throughout in this article to practice along. Now, take a quick look at the following two tables I have created.

INNER JOIN

This join returns rows when there is at least one match in both the tables.

OUTER JOIN

There are three different Outer Join methods.
LEFT OUTER JOIN
This join returns all the rows from the left table in conjunction with the matching rows from the right table. If there are no columns matching in the right table, it returns NULL values.
RIGHT OUTER JOIN
This join returns all the rows from the right table in conjunction with the matching rows from the left table. If there are no columns matching in the left table, it returns NULL values.
FULL OUTER JOIN
This join combines left outer join and right outer join. It returns row from either table when the conditions are met and returns null value when there is no match.

CROSS JOIN

This join is a Cartesian join that does not necessitate any condition to join. The resultset contains records that are multiplication of record number from both the tables.

Additional Notes related to JOIN:

The following are three classic examples to display where Outer Join is useful. You will notice several instances where developers write query as given below.
SELECT t1.*FROM Table1 t1WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)GO
The query demonstrated above can be easily replaced by Outer Join. Indeed, replacing it by Outer Join is the best practice. The query that gives same result as above is displayed here using Outer Join and WHERE clause in join.
/* LEFT JOIN - WHERE NULL */SELECT t1.*,t2.*FROM Table1 t1LEFT JOIN Table2 t2 ON t1.ID t2.IDWHERE t2.ID IS NULL
The above example can also be created using Right Outer Join.
NOT INNER JOIN
Remember, the term Not Inner Join does not exist in database terminology. However, when full Outer Join is used along with WHERE condition, as explained in the above two examples, it will give you exclusive result to Inner Join. This join will give all the results that were not present in Inner Join.
You can download the complete SQL Script here, but for the sake of complicity I am including the same script here.
USE AdventureWorks
GO
CREATE TABLE table1(ID INTValue VARCHAR(10))INSERT INTO Table1 (IDValue)SELECT 1,'First'UNION ALLSELECT 2,'Second'UNION ALLSELECT 3,'Third'UNION ALLSELECT 4,'Fourth'UNION ALLSELECT 5,'Fifth'GOCREATE TABLE table2(ID INTValue VARCHAR(10))INSERT INTO Table2 (IDValue)SELECT 1,'First'UNION ALLSELECT 2,'Second'UNION ALLSELECT 3,'Third'UNION ALLSELECT 6,'Sixth'UNION ALLSELECT 7,'Seventh'UNION ALLSELECT 8,'Eighth'GOSELECT *FROM Table1SELECT *FROM Table2
GO
USE AdventureWorks
GO
/* INNER JOIN */SELECT t1.*,t2.*FROM Table1 t1INNER JOIN Table2 t2 ON t1.ID t2.ID
GO
/* LEFT JOIN */SELECT t1.*,t2.*FROM Table1 t1LEFT JOIN Table2 t2 ON t1.ID t2.ID
GO
/* RIGHT JOIN */SELECT t1.*,t2.*FROM Table1 t1RIGHT JOIN Table2 t2 ON t1.ID t2.ID
GO
/* OUTER JOIN */SELECT t1.*,t2.*FROM Table1 t1FULL OUTER JOIN Table2 t2 ON t1.ID t2.ID
GO
/* LEFT JOIN - WHERE NULL */SELECT t1.*,t2.*FROM Table1 t1LEFT JOIN Table2 t2 ON t1.ID t2.IDWHERE t2.ID IS NULLGO/* RIGHT JOIN - WHERE NULL */SELECT t1.*,t2.*FROM Table1 t1RIGHT JOIN Table2 t2 ON t1.ID t2.IDWHERE t1.ID IS NULLGO/* OUTER JOIN - WHERE NULL */SELECT t1.*,t2.*FROM Table1 t1FULL OUTER JOIN Table2 t2 ON t1.ID t2.IDWHERE t1.ID IS NULL OR t2.ID IS NULLGO/* CROSS JOIN */SELECT t1.*,t2.*FROM Table1 t1CROSS JOIN Table2 t2
GO
DROP TABLE table1DROP TABLE table2
GO

Friday, October 19, 2012

Collections-ArrayList

Collections

In this chapter we will deal with C# collections. The .NET framework provides specialized classes for data storage and retrieval. In one of the previous chapters, we have described arrays. Collections are enhancement to the arrays.
There are two distinct collection types in C#. The standard collections, which are found under the System.Collections namespace and the generic collections, under System.Collections.Generic. The generic collections are more flexible and are the preferred way to work with data. The generic collections or generics were introduced in .NET framework 2.0. Generics enhance code reuse, type safety, and performance.

Generic programming is a style of computer programming in which algorithms are written in terms of to-be-specified-later types that are then instantiated when needed for specific types provided as parameters. This approach, pioneered by Ada in 1983, permits writing common functions or types that differ only in the set of types on which they operate when used, thus reducing duplication. (Wikipedia)

ArrayList

ArrayList is a collection from a standard System.Collections namespace. It is a dynamic array. It provides random access to its elements. An ArrayList automatically expands as data is added. Unlike arrays, an ArrayList can hold data of multiple data types. Elements in the ArrayList are accessed via an integer index. Indexes are zero based. Indexing of elements and insertion and deletion at the end of the ArrayList takes constant time. Inserting or deleting an element in the middle of the dynamic array is more costly. It takes linear time.
using System;
using System.Collections;

public class CSharpApp 
{
    class Empty
    {}
    
    static void Main()
    {
        ArrayList da = new ArrayList();

        da.Add("Visual Basic");
        da.Add(344);
        da.Add(55);
        da.Add(new Empty());
        da.Remove(55);

        foreach(object el in da)
        {
            Console.WriteLine(el);
        }
    }
}
In the above example, we have created an ArrayList collection. We have added some elements to it. They are of various data type, string, int and a class object.
using System.Collections;
In order to work with ArrayList collection, we need to import System.Collections namespace.
ArrayList da = new ArrayList();
An ArrayList collection is created.
da.Add("Visual Basic");
da.Add(344);
da.Add(55);
da.Add(new Empty());
da.Remove(55);
We add five elements to the array with the Add() method.
da.Remove(55);
We remove one element.
foreach(object el in da)
{
    Console.WriteLine(el);
}
We iterate through the array and print its elements to the console.
$ ./arraylist.exe 
Visual Basic
344
CSharpApp+Empty
Output.

List

A List is a strongly typed list of objects that can be accessed by index. It can be found under System.Collections.Generic namespace.
using System;
using System.Collections.Generic;

public class CSharpApp 
{

    static void Main()
    {
        List<string> langs = new List<string>();

        langs.Add("Java");
        langs.Add("C#");
        langs.Add("C");
        langs.Add("C++");
        langs.Add("Ruby");
        langs.Add("Javascript");

        Console.WriteLine(langs.Contains("C#"));

        Console.WriteLine(langs[1]);
        Console.WriteLine(langs[2]);

        langs.Remove("C#");
        langs.Remove("C");

        Console.WriteLine(langs.Contains("C#"));

        langs.Insert(4, "Haskell");

        langs.Sort();

        foreach(string lang in langs)
        {
            Console.WriteLine(lang);
        }
     
    }
}
In the preceding example, we work with the List collection.
using System.Collections.Generic;
In order to work with the List collection, we need to import the System.Collections.Genericnamespace.
List<string> langs = new List<string>();
A generic dynamic array is created. We specify that we will work with strings with the type specified inside <> characters.
langs.Add("Java");
langs.Add("C#");
langs.Add("C");
...
We add elements to the List using the Add() method.
Console.WriteLine(langs.Contains("C#"));
We check if the List contains a specific string using the Contains() method.
Console.WriteLine(langs[1]);
Console.WriteLine(langs[2]);
We access the second and the third element of the List using the index notation.
langs.Remove("C#");
langs.Remove("C");
We remove two strings from the List.
langs.Insert(4, "Haskell");
We insert a string at a specific location.
langs.Sort();
We sort the elements using the Sort() method.
$ ./list.exe 
True
C#
C
False
C++
Haskell
Java
Javascript
Ruby
Outcome of the example.

LinkedList

LinkedList is a generic doubly linked list in C#. LinkedList only allows sequential access. LinkedList allows for constant-time insertions or removals, but only sequential access of elements. Because linked lists need extra storage for references, they are impractical for lists of small data items such as characters. Unlike dynamic arrays, arbitrary number of items can be added to the linked list (limited by the memory of course) without the need to realocate, which is an expensive operation.
using System;
using System.Collections.Generic;

public class CSharpApp 
{

    static void Main()
    {
        LinkedList<int> nums = new LinkedList<int>();

        nums.AddLast(23);
        nums.AddLast(34);
        nums.AddLast(33);
        nums.AddLast(11);
        nums.AddLast(6);
        nums.AddFirst(9);
        nums.AddFirst(7);

        LinkedListNode<int> node = nums.Find(6);
        nums.AddBefore(node, 5);

        foreach(int num in nums)
        {
            Console.WriteLine(num);
        }
    }
}
This is a LinkedList example with some of its methods.
LinkedList<int> nums = new LinkedList<int>();
This is an integer LinkedList.
nums.AddLast(23);
...
nums.AddFirst(7);
We populate the linked list using the AddLast() and AddFirst() methods.
LinkedListNode<int> node = nums.Find(6);
nums.AddBefore(node, 5);
A LinkedList consists of nodes. We find a specific node and add an element before it.
foreach(int num in nums)
{
    Console.WriteLine(num);
}
Printing all elements to the console.

Dictionary

A dictionary, also called an associative array, is a collection of unique keys and a collection of values, where each key is associated with one value. Retrieving and adding values is very fast. Dictionaries take more memory, because for each value there is also a key.
using System;
using System.Collections.Generic;


public class CSharpApp 
{
    static void Main()
    {
        Dictionary<string, string> domains = new Dictionary<string, string>();

        domains.Add("de", "Germany");
        domains.Add("sk", "Slovakia");
        domains.Add("us", "United States");
        domains.Add("ru", "Russia");
        domains.Add("hu", "Hungary");
        domains.Add("pl", "Poland");

        Console.WriteLine(domains["sk"]);
        Console.WriteLine(domains["de"]);

        Console.WriteLine("Dictionary has {0} items",
            domains.Count);

        Console.WriteLine("Keys of the dictionary:");

        List<string> keys = new List<string>(domains.Keys);

        foreach(string key in keys)
        {
            Console.WriteLine("{0}", key);
        }        

        Console.WriteLine("Values of the dictionary:");

        List<string> vals = new List<string>(domains.Values);

        foreach(string val in vals)
        {
            Console.WriteLine("{0}", val);
        }

        Console.WriteLine("Keys and values of the dictionary:");


        foreach(KeyValuePair<string, string> kvp in domains)
        {
            Console.WriteLine("Key = {0}, Value = {1}", 
                kvp.Key, kvp.Value);
        }
    }
}
We have a dictionary, where we map domain names to their country names.
Dictionary<string, string> domains = new Dictionary<string, string>();
We create a dictionary with string keys and values.
domains.Add("de", "Germany");
domains.Add("sk", "Slovakia");
domains.Add("us", "United States");
...
We add some data to the dictionary. The first string is the key. The second is the value.
Console.WriteLine(domains["sk"]);
Console.WriteLine(domains["de"]);
Here we retrieve two values by their keys.
Console.WriteLine("Dictionary has {0} items",
    domains.Count);
We print the number of items by referring to the Count property.
List<string> keys = new List<string>(domains.Keys);

foreach(string key in keys)
{
    Console.WriteLine("{0}", key);
}  
These lines retrieve all keys from the dictionary.
List<string> vals = new List<string>(domains.Values);

foreach(string val in vals)
{
    Console.WriteLine("{0}", val);
}
These lines retrieve all values from the dictionary.
foreach(KeyValuePair<string, string> kvp in domains)
{
    Console.WriteLine("Key = {0}, Value = {1}", 
        kvp.Key, kvp.Value);
}
Finally, we print both keys and values of the dictionary.
$ ./dictionary.exe 
Slovakia
Germany
Dictionary has 6 items
Keys of the dictionary:
de
sk
us
ru
hu
pl
Values of the dictionary:
Germany
Slovakia
United States
Russia
Hungary
Poland
Keys and values of the dictionary:
Key = de, Value = Germany
Key = sk, Value = Slovakia
Key = us, Value = United States
Key = ru, Value = Russia
Key = hu, Value = Hungary
Key = pl, Value = Poland
This is the output of the example.

Queues

A queue is a First-In-First-Out (FIFO) data structure. The first element added to the queue will be the first one to be removed. Queues may be used to process messages as they appear or serve customers as they come. The first customer which comes should be served first.
using System;
using System.Collections.Generic;


public class CSharpApp 
{
    static void Main()
    {
        Queue<string> msgs = new Queue<string>();

        msgs.Enqueue("Message 1");
        msgs.Enqueue("Message 2");
        msgs.Enqueue("Message 3");
        msgs.Enqueue("Message 4");
        msgs.Enqueue("Message 5");

        Console.WriteLine(msgs.Dequeue());
        Console.WriteLine(msgs.Peek());
        Console.WriteLine(msgs.Peek());

        Console.WriteLine();

        foreach(string msg in msgs)
        {
            Console.WriteLine(msg);
        }
    }
}
In our example, we have a queue with messages.
Queue<string> msgs = new Queue<string>();
A queue of strings is created.
msgs.Enqueue("Message 1");
msgs.Enqueue("Message 2");
...
The Enqueue() adds a message to the end of the queue.
Console.WriteLine(msgs.Dequeue());
The Dequeue() method removes and returns the item at the beginning of the queue.
Console.WriteLine(msgs.Peek());
The Peek() method returns the next item from the queue, but does not remove it from the collection.
$ ./queue.exe 
Message 1
Message 2
Message 2

Message 2
Message 3
Message 4
Message 5
The Dequeue() method removes the "Message 1" from the collection. The Peek() method does not. The "Message 2" remains in the collection.

Stacks

A stack is a Last-In-First-Out (LIFO) data structure. The last element added to the queue will be the first one to be removed. The C language uses a stack to store local data in a function. The stack is also used when implementing calculators.
using System;
using System.Collections.Generic;


public class CSharpApp 
{
    static void Main()
    {
        Stack<int> stc = new Stack<int>();

        stc.Push(1);
        stc.Push(4);
        stc.Push(3);
        stc.Push(6);
        stc.Push(4);

        Console.WriteLine(stc.Pop());
        Console.WriteLine(stc.Peek());
        Console.WriteLine(stc.Peek());

        Console.WriteLine();

        foreach(int item in stc)
        {
            Console.WriteLine(item);
        }
    }
}
We have a simple stack example above.
Stack<int> stc = new Stack<int>();
A Stack data structure is created.
stc.Push(1);
stc.Push(4);
...
The Push() method adds an item at the top of the stack.
Console.WriteLine(stc.Pop());
The Pop() method removes and returns the item from the top of the stack.
Console.WriteLine(stc.Peek());
The Peek() method returns the item from the top of the stack. It does not remove it.
$ ./stack.exe 
4
6
6

6
3
4
1
Output.