using System; using System.Collections.Generic; using System.Linq; using System.Drawing; public class Book { public String Title { get; set; } public override String ToString() { return Title; } } class Program { static public Book[] Books = { new Book {Title="F"}, new Book {Title="B"} }; static void Main(string[] args) { var books = Books .Select((book, index) => new { index, book.Title }) .OrderBy(book => book.Title); } }
LINQ
Select – Indexed: prints the value of the integer and whether it matches its index in the array
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class MainClass { public static void Main() { int[] numbers = { 5, 4, 1, 3, 9}; var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); foreach (var n in numsInPlace) { Console.WriteLine("{0}: {1}", n.Num, n.InPlace); } } }
Use an indexed Where clause (where the length of the number's name is shorter than its value)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class MainClass {
public static void Main() {
string[] digits = { “zero”, “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine” };
var shortDigits = digits.Where((digit, index) => digit.Length < index); foreach (var d in shortDigits) { Console.WriteLine("The word {0} is shorter than its value.", d); } } } [/csharp]
Query by position
using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; class Person { int _id; int _idRole; string _lastName; string _firstName; public int ID { get { return _id; } set { _id = value; } } public int IDRole { get { return _idRole; } set { _idRole = value; } } public string LastName { get { return _lastName; } set { _lastName = value; } } public string FirstName { get { return _firstName; } set { _firstName = value; } } } class Program { static void Main(string[] args) { List<Person> people = new List<Person> { new Person { ID = 1, IDRole = 1, LastName = "A", FirstName = "B"}, new Person { ID = 2, IDRole = 2, LastName = "G", FirstName = "T"}, new Person { ID = 3, IDRole = 2, LastName = "G", FirstName = "M"}, new Person { ID = 4, IDRole = 3, LastName = "C", FirstName = "G"} }; var query = people.Select((p, index) => new { Position = index, p.FirstName, p.LastName }); } }
GroupJoin Operator
using System; using System.Linq; using System.Collections; using System.Collections.Generic; public class Employee { public int id; public string firstName; public string lastName; public static ArrayList GetEmployeesArrayList() { ArrayList al = new ArrayList(); al.Add(new Employee { id = 1, firstName = "J", lastName = "R" }); al.Add(new Employee { id = 2, firstName = "W", lastName = "G" }); al.Add(new Employee { id = 3, firstName = "A", lastName = "H" }); al.Add(new Employee { id = 4, firstName = "D", lastName = "L" }); al.Add(new Employee { id = 101, firstName = "K", lastName = "F" }); return (al); } public static Employee[] GetEmployeesArray() { return ((Employee[])GetEmployeesArrayList().ToArray()); } } public class EmployeeOptionEntry { public int id; public long optionsCount; public DateTime dateAwarded; public static EmployeeOptionEntry[] GetEmployeeOptionEntries() { EmployeeOptionEntry[] empOptions = new EmployeeOptionEntry[] { new EmployeeOptionEntry { id = 1, optionsCount = 2, dateAwarded = DateTime.Parse("1999/12/31") }, new EmployeeOptionEntry { id = 101, optionsCount = 2, dateAwarded = DateTime.Parse("1998/12/31") } }; return (empOptions); } } public class MainClass { public static void Main() { Employee[] employees = Employee.GetEmployeesArray(); EmployeeOptionEntry[] empOptions = EmployeeOptionEntry.GetEmployeeOptionEntries(); var employeeOptions = employees .GroupJoin( empOptions, e => e.id, o => o.id, (e, os) => new { id = e.id, name = string.Format("{0} {1}", e.firstName, e.lastName), options = os.Sum(o => o.optionsCount) }); foreach (var item in employeeOptions) Console.WriteLine(item); } }
uses GroupBy to partition trimmed elements of an array using a custom comparer
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class MainClass { public static void Main() { string[] anagrams = { "from ", " salt", " earn ", " last ", " near ", " form " }; var orderGroups = anagrams.GroupBy( w => w.Trim(), a => a.ToUpper(), new AnagramEqualityComparer() ); foreach (var v in orderGroups) { Console.WriteLine(v); } } public class AnagramEqualityComparer : IEqualityComparer<string> { public bool Equals(string x, string y) { return getCanonicalString(x) == getCanonicalString(y); } public int GetHashCode(string obj) { return getCanonicalString(obj).GetHashCode(); } private string getCanonicalString(string word) { char[] wordChars = word.ToCharArray(); Array.Sort<char>(wordChars); return new string(wordChars); } } }
uses group by to partition a list of each customer's orders, first by year, and then by month.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class MainClass {
public static void Main() {
List
var customerOrderGroups =
from c in customers
select
new {
c.CompanyName,
YearGroups =
from o in c.Orders
group o by o.OrderDate.Year into yg
select
new {
Year = yg.Key,
MonthGroups =
from o in yg
group o by o.OrderDate.Month into mg
select new { Month = mg.Key, Orders = mg }
}
};
Console.Write(customerOrderGroups);
}
static List
List
empTree.Add(new Product { ProductName = “A”, Category = “O”, UnitPrice = 12, UnitsInStock = 5, Total = 36, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = “B”, Category = “O”, UnitPrice = 2, UnitsInStock = 4, Total = 35, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = “C”, Category = “O”, UnitPrice = 112, UnitsInStock = 3, Total = 34, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = “D”, Category = “O”, UnitPrice = 112, UnitsInStock = 0, Total = 33, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = “E”, Category = “O”, UnitPrice = 1112, UnitsInStock = 2, Total = 32, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = “F”, Category = “O”, UnitPrice = 11112, UnitsInStock = 0, Total = 31, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
List
l.Add(new Customer { CompanyName = “A”, Region = “R1”, UnitsInStock = 1, Orders = empTree, CustomerId = 0 });
l.Add(new Customer { CompanyName = “B”, Region = “R2”, UnitsInStock = 2, Orders = empTree, CustomerId = 1 });
l.Add(new Customer { CompanyName = “C”, Region = “R3”, UnitsInStock = 3, Orders = empTree, CustomerId = 2 });
l.Add(new Customer { CompanyName = “D”, Region = “R4”, UnitsInStock = 4, Orders = empTree, CustomerId = 3 });
l.Add(new Customer { CompanyName = “E”, Region = “R5”, UnitsInStock = 5, Orders = empTree, CustomerId = 4 });
return l;
}
}
class Customer : IComparable
public string CompanyName { get; set; }
public string Region { get; set; }
public List
public int UnitsInStock { get; set; }
public int CustomerId { get; set; }
public override string ToString() {
return String.Format(“Id: {0}, Name: {1}, Region: {3}”, this.CustomerId, this.CompanyName, this.Region);
}
int IComparable
if (other == null)
return 1;
if (this.CustomerId > other.CustomerId)
return 1;
if (this.CustomerId < other.CustomerId)
return -1;
return 0;
}
}
class Product : IComparable
public string ProductName { get; set; }
public string Category { get; set; }
public int UnitPrice { get; set; }
public int UnitsInStock { get; set; }
public int Total { get; set; }
public DateTime OrderDate { get; set; }
public int Id { get; set; }
public override string ToString() {
return String.Format(“Id: {0}, Name: {1} , Category: {3}”, this.Id, this.ProductName, this.Category);
}
int IComparable
if (other == null)
return 1;
if (this.Id > other.Id)
return 1;
if (this.Id < other.Id) return -1; return 0; } } [/csharp]