Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Reflection;
- namespace Linq
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- string keuze = "";
- while (keuze != "99")
- {
- Console.WriteLine("\n\n-------------LINQ Menu--------------");
- Console.WriteLine("1. Step 1: Extension methods.");
- Console.WriteLine("2. Step 2: Enkele eenvoudige Linq operatoren.");
- Console.WriteLine("3. Step 3: Where en lambda expressies");
- Console.WriteLine("4. Step 4: Select en var/anonieme types");
- Console.WriteLine("5. Step 5: Nog meer handige LINQ operatoren");
- Console.WriteLine("6. Oefeningen");
- Console.WriteLine("99. Exit.");
- Console.Write("Enter your choice : ");
- keuze = Console.ReadLine();
- if (keuze != "99")
- {
- Type type = Type.GetType("Linq.Step" + keuze);
- if (type != null)
- {
- Object o = Activator.CreateInstance(type);
- type.GetMethod("Execute").Invoke(o, null);
- }
- }
- }
- }
- }
- }
- namespace Linq.Models
- {
- public class CityDistance
- {
- public string Country { get; set; }
- public string Name { get; set; }
- public int DistanceInKm { get; set; }
- public override string ToString()
- {
- return $"{Name} in {Country} at {DistanceInKm} km distance";
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using Linq.Models;
- namespace Extensions
- {
- public static class StringExtension
- {
- // voorbeeld: extension method gedefinieerd op string
- public static string RepeatText(this string s, int aantal)
- {
- string resultaat = string.Empty;
- for (int i = 0; i < aantal; i++)
- resultaat += s;
- return resultaat;
- }
- // voorbeeld: extension method gedefinieerd op IEnumerable<Location>
- public static IEnumerable<Location> CheckIfTrue(this IEnumerable<Location> locations, Func<Location, bool> method)
- {
- IList<Location> list = new List<Location>();
- foreach (Location l in locations)
- if (method(l))
- list.Add(l);
- return list;
- }
- }
- public static class IntExtension
- {
- // voorbeeld: extension method gedefinieerd op Int32
- public static bool IsEven(this int i)
- {
- return i % 2 == 0;
- }
- // voorbeeld: extension method gedefinieerd op IEnumerable<int>
- public static int CalculateSum(this IEnumerable<int> numbers)
- {
- if (numbers == null)
- throw new ArgumentException();
- int aux = 0;
- foreach (int i in numbers)
- aux += i;
- return aux;
- }
- // maak van IsdivisibleBy een extension method gedefinieerd op een geheel getal
- // de extension method retourneert true wanneer het getal
- // deelbaar is door een ander geheel getal (parameter!)
- public static bool IsDivisibleBy(this int i, int by)
- {
- return i % by == 0;
- }
- }
- }
- namespace Linq.Models
- {
- public class Location
- {
- public string Country { get; set; }
- public string City { get; set; }
- public int Distance { get; set; }
- public override string ToString()
- {
- return $"{City} in {Country} at {Distance} miles distance";
- }
- }
- }
- using System.Collections.Generic;
- namespace Linq.Models
- {
- public class TravelOrganizer
- {
- // list of places visited and their distance to Seattle
- public static IEnumerable<Location> PlacesVisited
- {
- get
- {
- return new List<Location>{
- new Location { City="London", Distance=4789, Country="UK" },
- new Location { City="Amsterdam", Distance=4869, Country="Netherland" },
- new Location { City="San Francisco", Distance=684, Country="USA" },
- new Location { City="Las Vegas", Distance=872, Country="USA" },
- new Location { City="Boston", Distance=2488, Country="USA" },
- new Location { City="Raleigh", Distance=2363, Country="USA" },
- new Location { City="Chicago", Distance=1733, Country="USA" },
- new Location { City="Charleston", Distance=2421, Country="USA" },
- new Location { City="Helsinki", Distance=4771, Country="Finland" },
- new Location { City="Nice", Distance=5428, Country="France" },
- new Location { City="Dublin", Distance=4527, Country="Ireland" }
- };
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using Extensions;
- namespace Linq
- {
- public class Step1
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 1. Extension methods.\n");
- // voorbeeld: extension methods gedefinieerd op Int32
- Console.WriteLine($"Is 6 even? {6.IsEven()}" );
- Console.WriteLine($"Is 7 even? {7.IsEven()}");
- for (int i = 0; i < 10; i++)
- {
- string even = i.IsEven() ? "even" : "odd";
- Console.WriteLine($"{i} is {even}");
- }
- // voorbeeld: extension methods gedefinieerd op string
- string hello = "Hello!";
- Console.WriteLine($"6 times {hello}, that's {hello.RepeatText(6)}");
- string myText = "Please repeat me...";
- Console.WriteLine(myText.RepeatText(2));
- // voorbeeld: extension method op IEnumerable<int>
- IList<int> numbers = new List<int> {1, 2, 3, 4, 5};
- Console.WriteLine($"De som is {numbers.CalculateSum()}");
- // extension method IsDivisibleBy geeft aan of
- // een geheel getal deelbaar is door een ander geheel getal
- // vervolledig de extension method in de klasse Extension, en vervolledig onderstaande for-loop
- // zodat enkel getallen die deelbaar zijn door 3 worden getoond, maak gebruik van de extension method
- Console.WriteLine("Getallen tussen 1 en 20 deelbaar door 3:");
- for (int i = 1; i <= 20; i++)
- if (i.IsDivisibleBy(3))
- Console.WriteLine(i);
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace Linq
- {
- public class Step2
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 2: Enkele eenvoudige Linq operatoren.\n");
- // Enkele Linq methodes op collecties van getallen
- int[] getallen = { 2, 8, 10 };
- Console.WriteLine($"De som is {getallen.Sum()}" );
- List<int> myList = new List<int>();
- myList.Add(2);
- myList.Add(10);
- myList.Add(10);
- Console.WriteLine($"De som is van de getallen in de lijst is {myList.Sum()}" );
- HashSet<double> getallenSet = new HashSet<double> { 2.5, 8.4, 10.6 };
- getallenSet.Add(2.5);
- getallenSet.Add(8.4);
- getallenSet.Add(10.6);
- Console.WriteLine($"De som van de getallen in de hashset is {getallenSet.Sum()} ...");
- // vervang "{0}" door een correcte Linq expressie
- Console.WriteLine($"Het minimum in de hashset is {getallenSet.Min()} ..." );
- Console.WriteLine($"De maximum in de hashset is {getallenSet.Max()} ...");
- Stack<float> getallenStack = new Stack<float>();
- getallenStack.Push(1.5F);
- getallenStack.Push(2.6F);
- getallenStack.Push(5F);
- // float somStack = getallenStack.Sum();
- Console.WriteLine($"De som van de getallen op de stack is {getallenStack.Sum()} ...");
- // vervang "{0}" door een correcte Linq expressie
- Console.WriteLine($"Het gemiddelde van de getallen op de stack is {getallenStack.Average()} ...");
- Console.WriteLine($"Het aantal getallen op de stack is {getallenStack.Count()} ...");
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Linq.Models;
- namespace Linq
- {
- public class Step3
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 3: Where en lambda expressies\n");
- IEnumerable<Location> placesVisited = TravelOrganizer.PlacesVisited;
- int sumDistances = placesVisited.Sum(l => l.Distance);
- Console.WriteLine($"De som van alle afstanden is {sumDistances} miles" );
- int[] results = { 12, 15, 7, 9, 10, 5, 0, 20 };
- // bereken hieronder het aantal results hoger of gelijk aan 10
- int nrOfPasses = results.Count(r => r >= 10);
- Console.WriteLine($"De resultaten bevatten {nrOfPasses} cijfers boven de helft" );
- Console.WriteLine();
- string[] cities = {
- "London", "Amsterdam", "San Francisco", "Las Vegas", "Boston", "Raleigh", "Chicago",
- "Charlestown", "Helsinki", "Nice", "Dublin"
- };
- // filter: steden waarvan de naam langer dan 5 posities
- IEnumerable<string> citiesWithlongNames = cities.Where(c => c.Length > 5);
- // onderstaande uit commentaar halen: demo deferred execution
- cities[0] = "Oostende";
- Console.WriteLine("Steden met namen langer dan 5 karakters:");
- foreach (var city in citiesWithlongNames)
- {
- Console.WriteLine(city);
- }
- Console.WriteLine();
- // steden waarvan de naam langer dan 5 posities, gesorteerd op naam
- IEnumerable<string> orderedPlaces = cities.Where(c => c.Length > 5).OrderBy(c => c).ToList();
- // cities[0] = "Oostende";
- Console.WriteLine("Gesorteerde lijst van steden met namen langer dan 5 karakters:");
- foreach (var city in orderedPlaces)
- {
- Console.WriteLine(city);
- }
- Console.WriteLine();
- // steden waarvan de naam langer is dan 5 posities en starten met de letter 'S'
- // gesorteerd dalend op lengte van de naam, en dan op de naam zelf
- string[] cities2 = {
- "London", "Amsterdam", "San Francisco", "Las Vegas", "Boston", "Raleigh", "Chicago",
- "Charlestown", "Helsinki", "Nice", "Dublin", "San Anselmo", "San Diego", "San Mateo"
- };
- // vul selectedCities adhv een gepaste Linq expressie
- IEnumerable<string> selectedCities =
- cities2.Where(c => c.StartsWith("S") && c.Length > 5).OrderByDescending(c => c.Length).ThenBy(c => c);
- Console.WriteLine("Steden met namen langer dan 5 karakters, en beginnend met 'S', dalend gesorteerd op lengte van de naam, dan op naam:");
- // schrijf hier de steden uit adhv een for each
- foreach (string city in selectedCities)
- Console.WriteLine(city);
- Console.WriteLine();
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Linq.Models;
- namespace Linq
- {
- public class Step4
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 4: Linq Select, var en anonieme types\n");
- IEnumerable<Location> placesVisited = TravelOrganizer.PlacesVisited;
- int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
- // simpele transaformatie van collectie van int-s
- IEnumerable<int> newNumbers = numbers.Select(g => g + 1);
- PrintCollection("De gewijzigde lijst van getallen:", newNumbers);
- // transformatie van Location-s naar int-s
- IEnumerable<int> cityLengths = placesVisited.Select(c => c.City.Length);
- PrintCollection("Lengte van de namen van de steden:", cityLengths);
- // transformatie van Location-s naar CityDistance-s, object initializer
- IEnumerable<CityDistance> cityDistances = placesVisited.Select(
- c => new CityDistance
- {
- Name = c.City,
- Country = c.Country,
- DistanceInKm = (int)(c.Distance * 1.61)
- });
- PrintCollection("Afstanden in km:", cityDistances);
- Console.WriteLine();
- // transformatie naar een anoniem type met de props Name, Country en DistanceInKm
- var anonymousCities = placesVisited.Select(c => new
- {
- Name = c.City,
- c.Country,
- DistanceInKm = c.Distance*1.61
- });
- PrintCollection("Anonieme types:", anonymousCities);
- Console.WriteLine();
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- // generische methode PrintCities<T>
- public static void PrintCollection<T>(string title, IEnumerable<T> cities)
- {
- Console.WriteLine();
- Console.WriteLine($"----- {title} -----");
- if (!cities.Any())
- Console.WriteLine("geen steden...");
- else
- foreach (var c in cities)
- Console.WriteLine(c);
- Console.WriteLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Linq.Models;
- namespace Linq
- {
- public class Step5
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 5 : Nog meer handige LINQ operatoren\n");
- IEnumerable<Location> placesVisited = TravelOrganizer.PlacesVisited;
- // FirstOrDefault: vind de verste stad
- Location furthest = placesVisited.OrderByDescending(c => c.Distance).FirstOrDefault();
- Console.WriteLine($"Verste stad: {furthest}");
- Console.WriteLine();
- // Skip n Take: cities 2 - 5
- IEnumerable<Location> locations = placesVisited.Skip(1).Take(5);
- Step4.PrintCollection("Cities skip 1 take 5", locations);
- Console.WriteLine();
- // Any/All:
- Console.WriteLine($"Is er een stad op meer dan 5000 miles afstand? {placesVisited.Any(c => c.Distance > 5000)}" );
- Console.WriteLine($"Liggen alle steden op zijn minst 2000 miles ver? {placesVisited.All(c => c.Distance >= 2000)}");
- Console.WriteLine();
- // SelectMany: flat list of countries and cities with use of collection initializer
- var flatListOfNames = placesVisited.SelectMany(c => new List<string> { c.City, c.Country });
- Console.WriteLine("Alle steden en landen in 1 lijst:");
- foreach (var n in flatListOfNames)
- Console.WriteLine($"- {n} -");
- Console.WriteLine();
- // Groeperen van gegevens: per land, de steden die behoren tot het land...
- var overzicht = placesVisited.GroupBy(l => l.Country, l => l.City);
- foreach (var overzichtsGroep in overzicht)
- {
- Console.WriteLine(overzichtsGroep.Key);
- foreach (string city in overzichtsGroep)
- Console.WriteLine($" - {city}" );
- }
- Console.WriteLine();
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using Linq.Models;
- using System.Linq;
- namespace Linq
- {
- public class Step6
- {
- public void Execute()
- {
- Console.WriteLine("\nStep 6 : Exercises\n");
- IEnumerable<Location> placesVisited = TravelOrganizer.PlacesVisited;
- // De gemiddelde afstand van de steden
- Console.WriteLine($"Gemiddelde afstand van de steden is {placesVisited.Average(p => p.Distance):0} miles");
- // De afstand van de verste stad
- Console.WriteLine($"De verste stad ligt op {placesVisited.Max(p => p.Distance):0} miles");
- // De verste stad in de USA
- Console.WriteLine($"De verste stad in de USA is {placesVisited.OrderByDescending(p => p.Distance).FirstOrDefault(p => p.Country == "USA")}");
- // Geef de namen van de landen met steden die niet in de USA liggen en op minder dan 4600 miles afstand liggen
- IEnumerable<string> nearbyNonUsaCities =
- placesVisited
- .Where(p => p.Country != "USA" && p.Distance < 4600)
- .Select(p => p.Country)
- .Distinct();
- Step4.PrintCollection("Dichte steden buiten de USA", nearbyNonUsaCities);
- // Een gesorteerde lijst van alle landen (elk land komt slechts 1 keer voor in de lijst)
- IEnumerable<string> countries = placesVisited
- .Select(p => p.Country)
- .Distinct()
- .OrderBy(c => c);
- Step4.PrintCollection("Alle landen in de lijst:", countries);
- // Maak een lijst van anonieme objecten die de properties City en InUSA hebben.
- // InUSA staat op true voor een city binnen de USA, anders op false
- var cityInfo = placesVisited
- .Select(p => new
- {
- p.City,
- InUSA = p.Country == "USA"
- });
- Console.WriteLine("Welke steden liggen in de USA?");
- Step4.PrintCollection("Anonieme type voor landen:", cityInfo);
- // Maak een array van CityDistance objecten voor alle Locations die in de USA liggen
- CityDistance[] cityDistances = placesVisited
- .Where(p => p.Country == "USA").
- Select(p => new CityDistance
- {
- Name = p.City,
- Country = p.Country,
- DistanceInKm = (int)(p.Distance * 1.6)
- }).ToArray();
- Step4.PrintCollection("CityDistances voor steden in USA:", cityDistances);
- Console.WriteLine("Druk op enter om verder te gaan...");
- Console.ReadLine();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using SportsStore.Models;
- using SportsStore.Data;
- using SportsStore.ViewModels;
- using System.Linq;
- namespace SportsStore
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- IEnumerable<Category> categories = DataSourceProvider.Categories;
- IEnumerable<Customer> customers = DataSourceProvider.Customers;
- IEnumerable<Product> products = DataSourceProvider.Products;
- #region Toon de gemiddelde prijs van de producten
- Console.WriteLine($"De gemiddelde prijs van de producten is { products.Average(p => p.Price):0.00}");
- Console.ReadLine();
- #endregion
- #region Toon hoeveel categorieen en hoeveel customers er zijn
- Console.WriteLine($"Er zijn {categories.Count()} categorieen.");
- Console.WriteLine($"Er zijn {customers.Count()} customers.");
- Console.ReadLine();
- #endregion
- #region Hoeveel karakters telt de langste productnaam?
- Console.WriteLine($"De langste productnaam is { products.Max(p => p.Name.Length)} karakters lang.");
- Console.ReadLine();
- #endregion
- #region Toon de naam van het product met de langste productnaam
- string productnaam = products
- .OrderByDescending(p => p.Name.Length)
- .FirstOrDefault()
- .Name;
- Console.WriteLine($"De langste productnaam is {productnaam}.");
- Console.ReadLine();
- #endregion
- #region Toon alle customers gesorteerd op naam, en vervolgens dalend op voornaam
- IEnumerable<Customer> customersSorted = customers
- .OrderBy(c => c.Name)
- .ThenByDescending(c => c.FirstName);
- PrintCustomers("Klanten gesorteerd op naam, en dan dalend op voornaam:", customersSorted);
- Console.ReadLine();
- #endregion
- #region Toon alle producten die meer dan 92.5 dollar kosten, dalend op prijs
- IEnumerable<Product> expensiveProducts =
- products.Where(p => p.Price > 92.5M)
- .OrderByDescending(p => p.Price);
- PrintProducts("Producten die meer dan 92.5 dollar kosten", expensiveProducts);
- Console.ReadLine();
- #endregion
- #region Toon de categorieen die meer dan twee producten bevatten
- IEnumerable<Category> myCategories =
- categories.Where(c => c.Products.Count > 2);
- PrintCategories("Categorieen met meer dan twee producten", myCategories);
- Console.ReadLine();
- #endregion
- #region Maak een lijst van strings die alle productnamen bevat
- IEnumerable<string> productNamen = products.Select(p => p.Name);
- PrintStrings("Namen van producten", productNamen);
- Console.ReadLine();
- #endregion
- #region Maak een lijst van namen van steden waar customers wonen (zonder dubbels)
- IEnumerable<string> steden = customers
- .Select(p => p.City.Name)
- .Distinct();
- PrintStrings("Namen van steden waar klanten wonen", steden);
- Console.ReadLine();
- #endregion
- #region Maak een lijst van ProductViewModels (vorm elk product om tot een productViewModel)
- IEnumerable<ProductViewModel> pvm =
- products
- .Select(p => new ProductViewModel
- {
- Name = p.Name,
- Price = p.Price,
- PriceEuro = p.Price * 0.9M
- });
- Console.WriteLine("Lijst van ProductViewModels");
- foreach (var p in pvm)
- {
- Console.WriteLine($"{p.Name} kost { p.Price:0.00} dollar, dat is {p.PriceEuro:0.00} euro");
- }
- Console.WriteLine();
- Console.ReadLine();
- #endregion
- #region Maak gebruik van een anoniem type
- // maak een lijst die de naam, de voornaam
- // en de naam van de stad van elke customer bevat
- var customerDetails = customers.Select(c => new
- {
- c.Name,
- c.FirstName,
- CityName = c.City.Name,
- });
- Console.WriteLine("Details van customers");
- foreach (var c in customerDetails)
- {
- Console.WriteLine($"{c.Name} {c.FirstName} woont in {c.CityName}");
- }
- Console.ReadLine();
- #endregion
- #region Pas vorige query aan
- // zodat het anoniem type nu ook een boolse property bevat
- // die aangeeft of de customer reeds orders heeft
- var customerDetails2 = customers.Select(c => new
- {
- c.Name,
- c.FirstName,
- CityName = c.City.Name,
- HasOrders = c.Orders.Any()
- });
- Console.WriteLine("Details van customers");
- foreach (var c in customerDetails2)
- {
- Console.WriteLine($"{c.Name} {c.FirstName} woont in {c.CityName} en heeft {(c.HasOrders ? String.Empty : "geen ")} bestellingen");
- }
- Console.ReadLine();
- #endregion
- #region Geef de namen van de categorieën met enkel producten die de letter 'o' in de naam hebben
- IEnumerable<string> oCategories = categories
- .Where(c => c.Products.All(p => p.Name.Contains("o")))
- .Select(c => c.Name);
- PrintStrings("Categorieen waarbij alle producten de letter 'o' bevatten", oCategories);
- Console.ReadLine();
- #endregion
- #region Geef het eerste product die de letter 'f' bevat, vertrek van de lijst van producten gesorteerd op naam
- Product myProductF = products.OrderBy(p => p.Name)
- .FirstOrDefault(p => p.Name.Contains("f"));
- PrintProduct("Eerste product met letter f", myProductF);
- Console.ReadLine();
- #endregion
- #region Maak een lijst van customers die reeds een product met de naam Football hebben besteld
- IEnumerable<Customer> customersWithFootball = customers
- .Where(c => c.Orders.SelectMany(o => o.OrderLines)
- .Select(o => o.Product.Name).Contains("Football"));
- //OR
- //IEnumerable<Customer> customersWithFootball = customers
- // .Where(c => c.Orders.Any(o => o.OrderLines.Any(ol => ol.Product.Name == "Football")));
- PrintCustomers("Klanten die reeds Football bestelden:", customersWithFootball);
- Console.ReadLine();
- #endregion
- #region Toon de voornaam van de customer met naam Student1.
- // Geef een gepaste melding indien
- // - er geen customers zijn met die naam,
- // - of indien er meerdere customers zijn met die naam
- // Test je code ook met Student0 en Student9
- string naam = "Student1";
- try
- {
- var customer = customers.SingleOrDefault(c => c.Name == naam);
- if (customer != null)
- Console.WriteLine($"Customer {customer.Name} { customer.FirstName}");
- else
- Console.WriteLine($"Er is geen customer met de naam {naam}");
- }
- catch (Exception)
- {
- Console.WriteLine($"Meerdere customers noemen {naam}");
- }
- Console.ReadLine();
- }
- #endregion
- #region Print helpmethodes
- private static void PrintCustomers(string message, IEnumerable<Customer> customers)
- {
- Console.WriteLine(message);
- foreach (Customer c in customers)
- Console.WriteLine($"{ c.Name} {c.FirstName}");
- Console.WriteLine();
- }
- private static void PrintProducts(string message, IEnumerable<Product> products)
- {
- Console.WriteLine(message);
- foreach (Product p in products)
- Console.WriteLine($"{ p.Name}, prijs: { p.Price}");
- Console.WriteLine();
- }
- private static void PrintCategories(string message, IEnumerable<Category> categories)
- {
- Console.WriteLine(message);
- foreach (Category c in categories)
- Console.WriteLine(c.Name);
- Console.WriteLine();
- }
- private static void PrintStrings(string message, IEnumerable<string> strings)
- {
- Console.WriteLine(message);
- foreach (string s in strings)
- Console.WriteLine(s);
- Console.WriteLine();
- }
- private static void PrintProduct(string message, Product product)
- {
- Console.WriteLine(message);
- if (product == null)
- Console.WriteLine("Product is null");
- else
- Console.WriteLine($"{ product.Name}, prijs: {product.Price}");
- Console.WriteLine();
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement