DNX: C#: Task Parallel Library

As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything isn’t roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.

The task parallel library seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.

 

Program.cs

using System;
using TPL = TaskParallelLibraryExample;

namespace ConsoleApp1 {
	
	public class Program {
		
		public void Main(string[] args){			
			Console.WriteLine("Main()");
			
			displayWhichDnxIsCompilingOn();
			
			new TPL.TaskParallelLibraryExample();
			
		}
		
		private void displayWhichDnxIsCompilingOn(){
			#if DNX451
			Console.WriteLine("Compiled on DNX451: .NET Framework");
			#endif
			
			#if DNXCORE50
			Console.WriteLine("Compiled on DNXCORE50: .NET Core 5");
			#endif						
		}

	}
	
}
TaskParallelLibraryExample.cs

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace TaskParallelLibraryExample {
	
	public class TaskParallelLibraryExample {
	
		public TaskParallelLibraryExample(){
			Console.WriteLine("\nTaskParallelLibraryExample");
				
			// Example 1		
			var task1 = new Task(() => {
				Console.WriteLine("Task 1 begins");
				Thread.Sleep(1000);
				Console.WriteLine("Task 1 ends");				
			});
			task1.Start();
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");
			
			// Example 2
			
			var task2 = new Task(() => {
				DoTask(2, 1000);	
			});
			task2.Start();
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");
			
			// Example 3
			
			var task3 = new Task(() => {
				DoTask(3, 1000);	
			});
			task3.Start();

			var task4 = new Task(() => {
				DoTask(4, 1000);	
			});
			task4.Start();

			var task5 = new Task(() => {
				DoTask(5, 1000);	
			});
			task5.Start();

			DisplayPressAnyKey();
			
			Console.WriteLine("------");

			// Example 4
			
			var task6 = Task.Factory.StartNew(() => {
				DoTask(6, 1000);	
			});

			var task7 = Task.Factory.StartNew(() => {
				DoTask(7, 1000);	
			});

			var task8 = Task.Factory.StartNew(() => {
				DoTask(8, 1000);	
			});

			DisplayPressAnyKey();
			
			Console.WriteLine("------");
		
			// Example 5
			
			var tasks9_10_11 = Task.Factory.StartNew(() => DoTask(9, 1000))
						.ContinueWith((prevTask) => DoTask(10,1000))
						.ContinueWith((prevTask) => DoTask(11,1000));

			DisplayPressAnyKey();
			
			Console.WriteLine("------");
			
			// Example 6
			
			var task12 = Task.Factory.StartNew(() => DoTask(12, 1000));
			var task13 = Task.Factory.StartNew(() => DoTask(13, 1000));
			var task14 = Task.Factory.StartNew(() => DoTask(14, 1000));

			var taskList = new List<Task>{ task12, task13, task14 };
			Task.WaitAll(taskList.ToArray());
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");
	
			// Example 7
			
			var task15 = Task.Factory.StartNew(() => DoTask(15, 1000));
			var task16 = Task.Factory.StartNew(() => DoTask(16, 1000));
			var task17 = Task.Factory.StartNew(() => DoTask(17, 1000));

			for (var i = 0; i < 10; ++i){
				Console.WriteLine("Inside task begins");
				Thread.Sleep(300);
				Console.WriteLine("Inside task ends");
			}
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");
			
			// Example 8
			
			var task18 = Task.Factory.StartNew(() => DoTask(18, 1000));
			var task19 = Task.Factory.StartNew(() => DoTask(19, 1000));
			var task20 = Task.Factory.StartNew(() => DoTask(20, 1000));

			taskList = new List<Task>{ task18, task19, task20 };
			Task.WaitAll(taskList.ToArray());

			for (var i = 0; i < 10; ++i){
				Console.WriteLine("Inside task again begins");
				Thread.Sleep(300);
				Console.WriteLine("Inside task again ends");
			}
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");
			
			// Example 9
			var listNames = new List<string> { "Alex", "Diego", "Vanina", "Ariel", "Juan", "David", "Candece", "Pablo", "Agustin"};
			Parallel.ForEach(listNames, name => Console.WriteLine(name));
			
			DisplayPressAnyKey();
			
			Console.WriteLine("------");

			// Example 10
			Parallel.For(0, 100, (number) => Console.Write(number + "->"));
						
			Console.WriteLine("\n------");
			
			// Example 11
			var cancelSource = new CancellationTokenSource();
			try{
				var continueTasks = Task.Factory.StartNew(() => DoTask(21, 1000))
									.ContinueWith((prevTask) => DoTask(22, 1000))
									.ContinueWith((prevTask) => DoAnotherTask(23, 1000, cancelSource.Token))
									.ContinueWith((prevTask) => DoTask(24, 1000));		
				cancelSource.Cancel();		
			} catch(Exception ex){
				Console.WriteLine("Exception: " + ex.GetType());
			}
			
			Console.WriteLine("\n------");
				
		}
		
		private void DisplayPressAnyKey(){
			Console.WriteLine("Press any key to quit");
			Console.ReadKey();			
		}
		
		private void DoTask(int id, int sleepTimeInMilliSeconds){
			Console.WriteLine("Task {0} begins", id);
			Thread.Sleep(1000);
			Console.WriteLine("Task {0} ends", id);				
		}
		
		private void DoAnotherTask(int id, int sleepTimeInMilliSeconds, CancellationToken token){
			if (token.IsCancellationRequested) {
				Console.WriteLine("Cancellation request");
				token.ThrowIfCancellationRequested();
			}
			
			Console.WriteLine("Another Task {0} begins", id);
			Thread.Sleep(1000);
			Console.WriteLine("Another Task {0} ends", id);				
		}
		
	}
	
}
Output:

AGCRM-MacBook-Pro:Examples user$ dnx . me
Main()
Compiled on DNX451: .NET Framework

TaskParallelLibraryExample
Press any key to quit
Task 1 begins
Task 1 ends
 ------
Press any key to quit
Task 2 begins
Task 2 ends
 ------
Press any key to quit
Task 4 begins
Task 3 begins
Task 5 begins
Task 4 ends
Task 3 ends
Task 5 ends
 ------
Press any key to quit
Task 6 begins
Task 7 begins
Task 8 begins
Task 7 ends
Task 6 ends
Task 8 ends
 ------
Press any key to quit
Task 9 begins
Task 9 ends
Task 10 begins
Task 10 ends
Task 11 begins
Task 11 ends
 ------
Task 12 begins
Task 13 begins
Task 14 begins
Task 12 ends
Task 13 ends
Task 14 ends
Press any key to quit
 ------
Inside task begins
Task 17 begins
Task 16 begins
Task 15 begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Task 16 ends
Task 17 ends
Task 15 ends
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Inside task begins
Inside task ends
Press any key to quit
 ------
Task 18 begins
Task 19 begins
Task 20 begins
Task 18 ends
Task 19 ends
Task 20 ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Inside task again begins
Inside task again ends
Press any key to quit
 ------
Alex
Juan
Candece
Agustin
Pablo
Ariel
David
Diego
Vanina
Press any key to quit
 ------
1->50->51->52->53->54->75->55->76->2->3->4->56->25->26->77->5->6->7->0->8->9->78->57->58->59->10->79->27->28->29->60->11->12->80->30->31->61->14->15->16->17->81->32->33->62->18->19->20->21->34->35->36->82->13->40->41->42->43->44->45->46->47->37->22->23->24->65->66->48->49->83->84->85->86->87->67->90->88->89->63->64->91->92->93->94->95->96->97->98->68->69->38->39->70->71->72->73->74->99->
------
Task 21 begins

------

Note: Actual output may be different when you run it.

Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: Task Parallel Library," in Alejandro G. Carlstein Ramos Mejia Blog, September 2, 2015, http://www.acarlstein.com/?p=3186.
Share

DNX: C#: Optional Parameters

As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything are not roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.

Optional parameters seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.

 

Program.cs

using System;
 
namespace ConsoleApp1 {
     
    public class Program {
         
        public void Main(string[] args){            
            Console.WriteLine("Main()");
             
            displayWhichDnxIsCompilingOn();
             
            new OptionalParameterExample.OptionalParameterExample();
             
        }
         
        private void displayWhichDnxIsCompilingOn(){
            #if DNX451
            Console.WriteLine("Compiled on DNX451: .NET Framework");
            #endif
             
            #if DNXCORE50
            Console.WriteLine("Compiled on DNXCORE50: .NET Core 5");
            #endif                      
        }
 
    }
     
}
OptionalParameterExample.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OptionalParameterExample {
	
	public class OptionalParameterExample {
	
		public OptionalParameterExample(){
			Console.WriteLine("\nOptionalParameterExample");
			
			// DisplayInfo(); // Doesn't work
			DisplayInfo("Alex");
			DisplayInfo("Alex", "Carlstein");
			DisplayInfo("Alex", "Carlstein", age:34);
			DisplayInfo("Alex", age: 35);
			DisplayInfo(lastName: "Carlstein");
			// DisplayInfo(lastName: "Carlstein", 35); // Doesn't work
			DisplayInfo(lastName: "Carlstein", age: 36);	

			
		}
		
		private void DisplayInfo(string firstName = null, string lastName = null, int age = 0){
			Console.WriteLine("{0} {1} is {2} years old.", firstName, lastName, age);
		}
		
	}
	
}
Output:

AGCRM-MacBook-Pro:Examples user$ dnx . me
Main()
Compiled on DNX451: .NET Framework

OptionalParameterExample
Alex  is 0 years old.
Alex Carlstein is 0 years old.
Alex Carlstein is 34 years old.
Alex  is 35 years old.
 Carlstein is 0 years old.
 Carlstein is 36 years old.
Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: Optional Parameters," in Alejandro G. Carlstein Ramos Mejia Blog, September 2, 2015, http://www.acarlstein.com/?p=3184.
Share

DNX: C#: Dynamic Keyword

As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything are not roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.

The dynamic keyword seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.

Program.cs

using System;

namespace ConsoleApp1 {
	
	public class Program {
		
		public void Main(string[] args){			
			Console.WriteLine("Main()");
			
			displayWhichDnxIsCompilingOn();
						
			new DynamicKeywordExample.DynamicKeywordExample();
			
		}
		
		private void displayWhichDnxIsCompilingOn(){
			#if DNX451
			Console.WriteLine("Compiled on DNX451: .NET Framework");
			#endif
			
			#if DNXCORE50
			Console.WriteLine("Compiled on DNXCORE50: .NET Core 5");
			#endif						
		}
		
	}
	
}
DynamicKeywordExample.cs

using System;

namespace DynamicKeywordExample {
	
	public class DynamicKeywordExample {
	
		public DynamicKeywordExample(){
			Console.WriteLine("\nDynamicKeywordExample");
			
			var test = "This is a string";
			
			//test = 5; // This will fail because cannot implicitly convert type 'int' to 'string'
			
			Console.WriteLine("Value: {0}", test);
			
			// To be able to change to any time you want use Dynamic DynamicKeywordExample
			
			dynamic test2 = "This is another string";
			
			Console.WriteLine("Value: {0}", test2);
			
			test2 = 10;
			
			Console.WriteLine("Value: {0}", test2);

			// Using Dynamic is bad for performance
			
		}
		
	}
	
}
Output:

AGCRM-MacBook-Pro:Examples user$ dnx . me
Main()
Compiled on DNX451: .NET Framework

DynamicKeywordExample
Value: This is a string
Value: This is another string
Value: 10
Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: Dynamic Keyword," in Alejandro G. Carlstein Ramos Mejia Blog, September 2, 2015, http://www.acarlstein.com/?p=3182.
Share

DNX: C#: Anonymous Types

As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything are not roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.

Anonymous Types seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.

 

Program.cs

using System;

namespace ConsoleApp1 {
	
	public class Program {
		
		public void Main(string[] args){			
			Console.WriteLine("Main()");
			
			displayWhichDnxIsCompilingOn();
			
			new AnonymousTypesExample.AnonymousTypesExample();
			
		}
		
		private void displayWhichDnxIsCompilingOn(){
			#if DNX451
			Console.WriteLine("Compiled on DNX451: .NET Framework");
			#endif
			
			#if DNXCORE50
			Console.WriteLine("Compiled on DNXCORE50: .NET Core 5");
			#endif						
		}

	}
	
}
AnonymousTypesExample.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace AnonymousTypesExample {
	
	public class AnonymousTypesExample {
	
		public AnonymousTypesExample(){
			Console.WriteLine("\nAnonymousTypesExample()");
			
			var people = new List<Person> {
				new Person { FirstName = "Alex", LastName = "Carlstein", Age = 33 },
				new Person { FirstName = "Diego", LastName = "Carlstein", Age = 32 },
				new Person { FirstName = "Alex", LastName = "Veron", Age = 40 },
				new Person { FirstName = "Vanina", LastName = "Veron", Age = 34 },
				new Person { FirstName = "Bob", LastName = "Smith", Age = 12 },
			};
			
			var result = from p in people
						 where p.LastName == "Carlstein"
						 select p;
		
			foreach (var item in result){
				Console.WriteLine(item.FirstName + " " + item.LastName);
			}
			
			Console.WriteLine("---------");
			
			var result2 = from p in people 
					 	  where p.LastName == "Carlstein"
					 	  select new { FName = p.FirstName, LName = p.LastName };
		
			foreach (var item in result2){
				Console.WriteLine(item.FName + " " + item.LName);
			}
			
			Console.WriteLine("---------");
			
			foreach (var item in result2){
				Console.WriteLine(item.FName + " " + item.LName);				
				// item.FName = "Rick"; // Cannot do this because FName is read-only								
			}

		}

	}

	public class Person {
		
		public string FirstName { get; set; }
		public string LastName { get; set; }
		public int Age { get; set; }
		public int Dollars { get; set; }
		public int Pesos { get; set; }
		public int Yens { get; set; }
				
	}

}
Output:

AGCRM-MacBook-Pro:Examples user$ dnx . me
Main()
Compiled on DNX451: .NET Framework

AnonymousTypesExample()
Alex Carlstein
Diego Carlstein
---------
Alex Carlstein
Diego Carlstein
---------
Alex Carlstein
Diego Carlstein
Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: Anonymous Types," in Alejandro G. Carlstein Ramos Mejia Blog, September 1, 2015, http://www.acarlstein.com/?p=3180.
Share

DNX: C#: LINQ

As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything are not roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.

Language Integrated Query (LINQ) seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.

Program.cs

using System;

namespace ConsoleApp1 {
	
	public class Program {
		
		public void Main(string[] args){			
			Console.WriteLine("Main()");
			
			displayWhichDnxIsCompilingOn();
			
			new LINQExample.LINQExample();
			
		}
		
		private void displayWhichDnxIsCompilingOn(){
			#if DNX451
			Console.WriteLine("Compiled on DNX451: .NET Framework");
			#endif
			
			#if DNXCORE50
			Console.WriteLine("Compiled on DNXCORE50: .NET Core 5");
			#endif						
		}
		
	}
	
}
LINQExample.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace LINQExample {
	
	public class LINQExample {
	
		public LINQExample(){
			Console.WriteLine("\nLINQExample()");
			
			var sample = "This is a text example to show how LINQ works";
			
			var result = from s in sample 
						 select s;
						 
			foreach (var item in result){
				Console.Write(item + "-");
			}
			
			Console.WriteLine("\n------");
			
			result = from s in sample
					 where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					 select s;
					 
			foreach (var item in result){
				Console.Write(item + "-");
			}
			
			Console.WriteLine("\n------");
			
			result = from s in sample.ToLower()
					 where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					 select s;
					 
			foreach (var item in result){
				Console.Write(item + "-");
			}
			
			Console.WriteLine("\n------");
			
			result = from s in sample.ToLower()
					 where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					 orderby s // ascending by default
					 select s;
					 
			foreach (var item in result){
				Console.Write(item + "-");
			}
			
			Console.WriteLine("\n------");

			result = from s in sample.ToLower()
					 where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					 orderby s descending
					 select s;
					 
			foreach (var item in result){
				Console.Write(item + "-");
			}
			
			Console.WriteLine("\n------");

			var result2 = from s in sample.ToLower()
					 	  where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					 	  group s by s;					 
					 
			foreach (var item in result2){
				Console.WriteLine(item);
			}
			
			Console.WriteLine("\n------");

			result2 = from s in sample.ToLower()
					  where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					  group s by s;					 
					 
			foreach (var item in result2){
				Console.Write(item.Key + "-");
			}
			
			Console.WriteLine("\n------");

			result2 = from s in sample.ToLower()
					  where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					  orderby s descending
					  group s by s;					 
					 
			foreach (var item in result2){
				Console.Write(item.Key + "-");
			}
			
			Console.WriteLine("\n------");

			result2 = from s in sample.ToLower()
					  where s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u'
					  orderby s 
					  group s by s;					 
					 
			foreach (var item in result2){
				Console.WriteLine(item.Key + ":" + item.Count());
			}
			
			Console.WriteLine("\n------");
			
			var people = new List<Person>{
				new Person { FirstName = "Alex", LastName = "Carlstein", Age = 33 },
				new Person { FirstName = "Diego", LastName = "Carlstein", Age = 32 },
				new Person { FirstName = "Alex", LastName = "Veron", Age = 40 },
				new Person { FirstName = "Vanina", LastName = "Veron", Age = 34 },
				new Person { FirstName = "Bob", LastName = "Smith", Age = 12 },
			};
			
			var result3 = from p in people
						  select p;
			
			foreach (var item in result3){
				Console.WriteLine("{0} {1}: {2}", item.FirstName, item.LastName, item.Age);
			}

			Console.WriteLine("\n------");
			
			result3 = from p in people
						  where p.Age < 35
						  select p;
			
			foreach (var item in result3){
				Console.WriteLine("{0} {1}: {2}", item.FirstName, item.LastName, item.Age);
			}

			Console.WriteLine("\n------");
			
			result3 = from p in people
						  where p.Age < 35 && p.LastName == "Carlstein"
						  select p;
			
			foreach (var item in result3){
				Console.WriteLine("{0} {1}: {2}", item.FirstName, item.LastName, item.Age);
			}

			Console.WriteLine("\n------");

			result3 = from p in people
						  orderby p.LastName
						  select p;
			
			foreach (var item in result3){
				Console.WriteLine("{0}, {1}: {2}", item.LastName, item.FirstName, item.Age);
			}

			Console.WriteLine("\n------");

			var result4 = from p in people
						  orderby p.LastName descending
						  group p by p.LastName;
			
			foreach (var item in result4){
				
				Console.WriteLine(item.Key + ": " + item.Count());
				foreach (var p in item){
					Console.WriteLine("\t{0}, {1}", p.LastName, p.FirstName);
				}
				
			}

			Console.WriteLine("\n------");
			
		}
		
		public class Person {
			public string FirstName { get; set; }
			public string LastName { get; set; }
			public int Age { get; set; }
		}
		
	}
		
}
Output:

AGCRM-MacBook-Pro:Examples user$ dnx . me
Main()
Compiled on DNX451: .NET Framework

LINQExample()
T-h-i-s- -i-s- -a- -t-e-x-t- -e-x-a-m-p-l-e- -t-o- -s-h-o-w- -h-o-w- -L-I-N-Q- -w-o-r-k-s-
------
i-i-a-e-e-a-e-o-o-o-o-
------
i-i-a-e-e-a-e-o-o-o-i-o-
------
a-a-e-e-e-i-i-i-o-o-o-o-
------
o-o-o-o-i-i-i-e-e-e-a-a-
------
System.Linq.Grouping`2[System.Char,System.Char]
System.Linq.Grouping`2[System.Char,System.Char]
System.Linq.Grouping`2[System.Char,System.Char]
System.Linq.Grouping`2[System.Char,System.Char]

------
i-a-e-o-
------
o-i-e-a-
------
a:2
e:3
i:3
o:4

------
Alex Carlstein: 33
Diego Carlstein: 32
Alex Veron: 40
Vanina Veron: 34
Bob Smith: 12

------
Alex Carlstein: 33
Diego Carlstein: 32
Vanina Veron: 34
Bob Smith: 12

------
Alex Carlstein: 33
Diego Carlstein: 32

------
Carlstein, Alex: 33
Carlstein, Diego: 32
Smith, Bob: 12
Veron, Alex: 40
Veron, Vanina: 34

------
Veron: 2
	Veron, Alex
	Veron, Vanina
Smith: 1
	Smith, Bob
Carlstein: 2
	Carlstein, Alex
	Carlstein, Diego

------
Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: LINQ," in Alejandro G. Carlstein Ramos Mejia Blog, September 1, 2015, http://www.acarlstein.com/?p=3178.
Share