LINQ Summary
LINQ Summary
1. Determinati cuvintele dintr-un text care sunt scrise cu litere mari. (String.Equals)
2. Afisati numerele si frecventele lor de apartitie dintr-un sir de numere.
3. Determinati toate numerele distincte dintr-un sir si patratele lor, daca patratele sunt mai
mari decat 20.
4. Join
5. Query pe un XML file.
------------------------------------------------
static void Main(string[] args)
{
//1
String text = "ACESTA Este UN Text MARE";
int[] numbers = { 1, 2, 3, 5, 2, 1, 2, 3, 6, 2, 2, 4, 1, 2, 1, 4, 6, 2, 4, 1, 2, 5, 7 };
var result = from number in numbers
group number by number into g
select new
{
Valoare = g.Key,
Frecventa = g.Count()
};
result.ToList().ForEach(x => Console.WriteLine($"Valoare {x.Valoare} : Frecventa
{x.Frecventa}"));
//sau
numbers
.ToList()
.GroupBy(x => x)
.ToList()
.Select(gr =>
{
return new
{
Valoare = gr.Key,
Frecventa = gr.Count()
};
}).ToList()
.ForEach(x => Console.WriteLine(
$"Valoare {x.Valoare} : Frecventa {x.Frecventa}"));
Asa cum ati observat, LINQ ofera doua modalitati de a scrie interogari:
1. Folosind sintaxa asemanatoare SQL- denumite Query expressions (Queryable)
int[] numbers = { 7, 53, 45, 99 };
var res = from n in numbers
where n > 50
orderby n
select n.ToString();
2. Extensii de metode (IEnumerable)
var res2 = numbers
.Where(n => n > 50)
.OrderBy(n => n)
.Select(n => n.ToString());
Deferred and immediate execution
LINQ queries can execute in two different ways: deferred and immediate:
With deferred execution, the resulting sequence of a LINQ query is not generated until it is
required. The following query does not actually execute until Max() is called, and a final
result is required:
Exemplu 1: Deferred
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Where(n => n >= 2 && n <= 4);
Console.WriteLine(result.Max());
Exemplu 2: immediate
string[] words = { "one", "two", "three" };
var result = words.Select((w, i) => new { Index = i, Value = w })
.Where(w => w.Value.Length == 3).ToList();
Adding items to an existing query is another benefit of deferred execution. The following
example shows the concept:
Exemple 3:
List<String> vegetables = new List<String> { "Carrot", "Selleri" };
var result = from v in vegetables select v;
Console.WriteLine("Elements in vegetables array (before add): " +
result.Count());
vegetables.Add("Broccoli");
Console.WriteLine("Elements in vegetables array (after add): " +
result.Count());
Deferred execution makes it useful to combine or extend queries. Have a look at this example,
which creates a base query and then extends it into two new separate queries:
LINQ Operatori
Aggregate: Performs a specified operation to each element in a collection, while carrying the result
forward.
ElementAtOrDefault: Retrieves element from a collection at specified (zero-based) index, but gets
default value if out-of-range.
class English2German
{
public string EnglishSalute { get; set; }
public string GermanSalute { get; set; }
}
English2German[] english2German =
{
new English2German { EnglishSalute = "Good morning", GermanSalute = "Guten Morgen" },
new English2German { EnglishSalute = "Good day", GermanSalute = "Guten Tag" },
new English2German { EnglishSalute = "Good evening", GermanSalute = "Guten Abend" },
};
int[] numbers = { 1, 2, 2, 3, 5, 6, 6, 6, 8, 9 };
var result = (from n in numbers.Distinct()
select n);
Console.WriteLine("Distinct removes duplicate elements:");
result.ToList().ForEach(x => Console.WriteLine(x));
Except: Removes all elements from one collection which exist in another collection.
int[] numbers1 = { 1, 2, 3 };
int[] numbers2 = { 3, 4, 5 };
var result = (from n in numbers1.Except(numbers2) select n);
Join: Joins two collections by a common key value, and is similar to inner join in SQL
Exemplu 1
Console.WriteLine("Joined countries which are both warm and European using Query
Syntax:");
foreach (var country in result)
Console.WriteLine(country);
Exemplu 2
ThenBy: Use after earlier sorting, to further sort a collection in ascending order.
XML Query
//fetching all MessageTask
XDocument document = XDocument.Load("D:\\Messages.xml");
// Fetch All the Messages
var messages = from r in document.Descendants("messageTask")
select new
{
//Desc = 1,
Id = r.Attribute("id").Value,
Desc = r.Element("desc").Value,
From = r.Element("from").Value,
To = r.Element("to").Value,
Message = r.Element("message").Value
};
messages.ToList().ForEach(x => Console.WriteLine(x.Id + " " +x.Desc + " " +x.From+"
"+x.Message));
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("messageTasks");
xmlWriter.WriteStartElement("messageTask");
xmlWriter.WriteAttributeString("id", "3");
xmlWriter.WriteStartElement("desc");
xmlWriter.WriteString("Sarbatori fericite!");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("from");
xmlWriter.WriteString("Jane");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("to");
xmlWriter.WriteString("Michelle");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("message");
xmlWriter.WriteString("Craciun Fericit!");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();