200 likes | 349 Vues
This presentation by Andrew Gray introduces the fundamentals of LINQ (Language-Integrated Query) and Lambda expressions, focusing on their usage in C#. It covers topics such as the purpose and application of LINQ, considerations for parallelization, and the functionality of Lambda expressions. With insights into the syntax and practical examples, this session aims to improve your querying capabilities in .NET applications. Whether you're a developer or a technical tester, mastering these concepts can enhance your coding efficiency.
E N D
Presented by: Andrew Gray Introduction to LINQand Lambda Expressions Introduction to LINQ and Lambda Expressions
About Me Andrew Gray • Developer • Current Work: Technical Test Engineer at McLane Advanced Technologies (Ranorex Studio/C#) • Hobbies: Music, Gaming, Indie Game Development • Game Engines: Torque, Unity Previous Works: http://andrewrgray.webs.com/games.html (Requires Unity Webplayer) Introduction to LINQ and Lambda Expressions
Agenda • What is LINQ? • Using LINQ • LINQ Considerations • What is a Lambda Expression? • Using Lambda Expressions • Lambda Considerations • Open Discussion • References • Conclusion Introduction to LINQ and Lambda Expressions
What is LINQ? • Acronym – Language-Integrated Query [1] • Purpose - Improvement in notation • Introduced in .NET 3.5 / Visual Studio 2008 • Provides SQL-like operations for searching in-memory data [2] • Often suggested by ReSharper when an IEnumerable is iterated over in a loop. No, not him... Introduction to LINQ and Lambda Expressions
Using LINQ – Standard Form • Create Query [2] • Execute the Query on a data source [3] using System.Core; // …Other Declarations… private static DataRow[] FindRowsInTable(DataTable table, string field, string value) { return (fromDataRow r intable.Rows where r[field].ToString() == value select r).ToArray(); } Introduction to LINQ and Lambda Expressions
Using LINQ - Parallelization • Parallelization in LINQ is achieved by adding .AsParallel() after the collection name. [4] • Parallel LINQ by default uses all cores up to 64, but can be limited by using .DegreeOfParallelism(int cores) [4] • Using PLINQ can yield a performance benefit for your application, as core usage can be controlled. [4] using System.Core; // …Other Declarations… private static DataRow[] FindRowsInTable(DataTable table, string field, string value) { return (fromDataRow r intable.Rows.AsParallel().WithDegreeOfParallelism(2) where r[field].ToString() == value select r).ToArray(); } Introduction to LINQ and Lambda Expressions
LINQ Considerations • Syntactic Sugar (Replaces for/foreach loop with SQL-like syntax) • Parallelization is possible – potential speed boost • Query execution is deferred from declaration • Additional methods have been added in the IQueryable interface • Code Smell: LINQ query on information read from a database • A SQL query is generally better • Some LINQ commands take Lambda Expressions as parameters Introduction to LINQ and Lambda Expressions
What is a Lambda Expression? • Origin – Anonymous Functions • Lambda Calculus (1936 – Alonzo Church) [5] • LISP (1957) [4] • Purpose • A refined way of defining anonymous methods or delegates • Implements “closures” in C# • Closure: “A function together with a referencing environment for the non-local variables of that function.” [6] • No/Limited tail-call optimization in C# • Language syntax is limited inside a Lambda What do you call a baby eigensheep? Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Lambdas take the form: (args[]) => { statements; } • Formally, => (lambda operator) reads as ‘[Left] goes to [Right]’ [7] • Lambdas accept a void parameter list. • () => statement(s); • Lambdas do not require arguments to refer to external variables • return isn’t required to get the result of a lambda, unless the value or reference of an internal variable is being returned. • Func<int, int> foo = a => { intb = 7; returna + b; } • As with delegates, anonymous methods are called by using the variable with the given parameters. • returnfoo(3); • The definition is not executed until it is called! Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Lambdas can be mapped to the first-class function (Func<[types]>) generic type • The last type in the generic is the return type; all types before that are argument types. • Provides a means of storing or returning Lambdas with strong typing • Lambdas can also be mapped to Action<[types]> • All parameters are inputs • Actions have a void return type. Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Keywords break, continue, and goto are not supported in Lambdas. [7] • The params keyword cannot be used in Func<> or the lambda’s parameter list. • params can be used with standard delegate declarations. • Optional parameters are not supported in Lambdas. • Func<int> foo(inta = 7) => a*a;Does not compile! • Cannot enclose ref or out parameters from the parent scope. [7] • Cannot be on the left side of is or as[7] • Lambdas in C# cannot be recursive like a named method Introduction to LINQ and Lambda Expressions
Using Lambda Expressions public class CoinExample { private const string _Heads = “Heads!”; private const string _Tails = “Tails!”; privateFunc<string> _Flip; privateFunc<string, string, string> _Tree; private void CoinFlipper() { Random generator = new Random(GetSeed()); _Flip = () => ((generator.Next() % 2) == 0) ? _Heads : _Tails; _Tree = (lhs, rhs) => lhs + “ x ” + rhs; Console.WriteLine(“Result: ” + _Tree(_Flip(),_Flip()); } } Introduction to LINQ and Lambda Expressions
Using Lambda Expressions – IQueryable • Lambda Expressions are often arguments in various IQueryable methods! • .Where(Func<bool>) • .Select(Func<bool>) privatestaticDataRowFoo(DataTable table, stringfindMe) { if (table == null || table.Rows.Count == 0) throw new ArgumentNullException(“table”); DataRow query = table.Where(a => a == findMe).GetFirstOrDefault(); return query; } Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Lambdas do not require arguments to refer to external variables Func<string> _Compare; private void Foo() { const inta = 7, b = 7; // With Lambda Expression… _Compare = () => a == b ? "Yes" : "No"; Console.WriteLine("Does A match B? " + _Compare()); // Normal way… Console.WriteLine(“Does A match B? “ + a == b ? “Yes” : “No”); } Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Lambdas can be modified after initial declaration, but ReSharper will show a warning for the modification! Func<bool> _Compare; private void Foo(int a, int b) { // Initial declaration _Compare = () => a == b; Console.WriteLine( “Does A match B? “ + _Compare() ? “Yes” : “No” ); _Compare = () => a > b; // Warning here! Console.WriteLine( “Is A greater than B? “ + _Compare() ? “Yes” : “No” ); } Introduction to LINQ and Lambda Expressions
Using Lambda Expressions • Lambda Expressions can help implement dependency injection. public classActionInjectionExample { private decimal _Primary; private decimal _Alt; public boolIsGreater { getBinaryCompare(() => _Primary > _Alt); } public boolIsLesser { getBinaryCompare(() => _Primary < _Alt); } public boolBinaryCompare(Func<bool> action) { // Implementation details… boolresult = action(); // Further details… return result; } } Introduction to LINQ and Lambda Expressions
Lambda Considerations • Pros • Provides support for first-class functions and expression trees • Useful as arguments to certain LINQ query operations. • Useful when a delegate will have a simple body. • Lambdas can help implement dependency injection. • Neutral • Lambdas defer execution until use. • Cons • Unsubscribing a Lambda from an event requires additional work. [9] • Variables used in a Lambda are not garbage collected until the referencing delegate goes out of scope. [6] • There is evidence that using local variables inside Lambdas can cause resource leaks. [8] • Variables that are not primitives are passed by reference. [10] Introduction to LINQ and Lambda Expressions
Open Discussion • Questions? • Past Experience? Introduction to LINQ and Lambda Expressions
References 1http://msdn.microsoft.com/en-us/library/bb397926.aspx (Introduction to LINQ) 2http://msdn.microsoft.com/en-us/library/bb397906.aspx (LINQ) 3http://stackoverflow.com/questions/1524813/convert-this-linq-expression-into-lambda (LINQ example) 4http://msdn.microsoft.com/en-us/library/dd997425.aspx (Introduction to PLINQ) 5http://en.wikipedia.org/wiki/Anonymous_function (Anonymous Function/Lambda Expression) 6http://en.wikipedia.org/wiki/Closure_(computer_science) (Lexical Closures) 7http://msdn.microsoft.com/en-us/library/bb397687.aspx (Lambda Expressions - MSDN) 8http://alookonthecode.blogspot.com/2011/05/lambda-expressions-anonymous-classes.html (Issues) 9http://www.h3mm3.com/2011/06/unsubscribing-to-events-in-c.html (Unsubscribing from Lambdas) 10http://msdn.microsoft.com/en-us/library/ms228360(v=vs.90).aspx (Passing Primitives / Classes) Introduction to LINQ and Lambda Expressions
Fin. Thank you for attending! andrew.russel.gray@gmail.com Introduction to LINQ and Lambda Expressions