From 816a9101accf90b838e258e007dd670baf1f816e Mon Sep 17 00:00:00 2001
From: Marcello Lamonaca <marcello.lamonaca@gmail.com>
Date: Fri, 26 Feb 2021 09:21:20 +0100
Subject: [PATCH] Add common methods of LINQ

---
 .NET/C#/LINQ .md | 41 ++++++++++++++++++++---------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/.NET/C#/LINQ .md b/.NET/C#/LINQ .md
index fa92d87..e565f9a 100644
--- a/.NET/C#/LINQ .md	
+++ b/.NET/C#/LINQ .md	
@@ -10,7 +10,7 @@ LINQ to Objects will be used when any `IEnumerable<T>` is specified as the sourc
 
 ### Query Expressions
 
-All query expressions are required to begin with a `from` clause, which specifies the source of the query.
+All query expressions are required to begin with a `from` clause, which specifies the source of the query.  
 The final part of the query is a `select` (or `group`) clause. This determines the final output of the query and its sytem type.
 
 ```cs
@@ -21,11 +21,10 @@ var result = from item in enumerable select item;
 var result = from item in enumerable where condition select item;
 
 // ordering
-var result = from item in enumerable orderby item.property select item;  // ordered Ienumerble
+var result = from item in enumerable orderby item.property select item;  // ordered IEnumerble
 
-// let clause
-var result = from item in enumerable let tmp = <sub-expr> ...  // assign expression to variable to avoid re-evaluetion on each cycle
-// BEWARE: compiled code has a lot of overhead to satisfy let caluse
+// let clause, assign expression to variable to avoid re-evaluetion on each cycle
+var result = from item in enumerable let tmp = <sub-expr> ...  // BEWARE: compiled code has a lot of overhead to satisfy let caluse
 
 // grouping (difficult to re-implement to obtain better performance)
 var result = from item in enumerable group item by item.property;  // returns IEnumerable<IGrouping<TKey,TElement>>
@@ -33,7 +32,7 @@ var result = from item in enumerable group item by item.property;  // returns IE
 
 ### How Query Expressions Expand
 
-The compiler converts all query expressions into one or more method calls. Once it has done that, the LINQ provider is selected through exactly the same mechanisms that C# uses for any other method call.
+The compiler converts all query expressions into one or more method calls. Once it has done that, the LINQ provider is selected through exactly the same mechanisms that C# uses for any other method call.  
 The compiler does not have any built-in concept of what constitutes a LINQ provider.
 
 ```cs
@@ -48,24 +47,24 @@ The `Where` and `Select` methods are examples of LINQ operators. A LINQ operator
 ```cs
 Enumerable.Range(int start, int end);  // IEnumerable<int> of values between start & end
 
-// max item in the IEnumerable
-IEnumerable<T>.Max(); // source must implement IComparable<T>
+IEnumerable<TSource>.Select(Func<TSource, TResult> selector)  // map
+IEnumerable<TSource>.Where(Func<T, bool> predicate)  // filter
 
-// check if condition is true for all IEnumerbale
-IEnumerable<T>.All(IEnumerable<T> source, Func<T, bool> predicate);
-IEnumerable<T>.All(IEnumerable<T> source.Predicate);
+IEnumerable<T>.FirstOrDefault()  // first element of IEnumerable or default(T) if empty
+IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate)  // first element to match predicate or default(T)
+
+// T must implement IComparable<T>
+IEnumerable<T>.Max(); 
+IEnumerable<T>.Min();
+
+IEnumerable<T>.All(Func<T, bool> predicate);  // check if condition is true for all elements
+IEnumerable<T>.Any(Func<T, bool> predicate);  // check if condition is true for at least one element
 ```
 
-## LINQ to JSON (JSON.NET)
-
-Parses JSON data into objects of type `JObject`, `JArray`, `JProperty`,  and  `JValue`,  all  of  which  derivefrom  a  `JToken`  base  class.
-Using these types is similar to working with JSON from JavaScript: it's possible to access the content directly without having to define classes.
+**NOTE**: `Enumerable` provides a set of `static` methods for querying objects that implement `IEnumerable<T>`. Most methods are extensions of `IEnumerable<T>`
 
 ```cs
-var jo = (JObject) JToken.Parse(json);  // parse json
-
-var propery = jo["property"].Value<Type>();  // extract and convert data from json
-
-// linq query
-IENumerable<JProperty> props = jo.Descendants().OfType<JProperty>().Where(p => condition);
+Enumerable.Method(IEnumerable<T> source, args);
+// if extension method same as
+IEnumerable<T>.Method(args)
 ```