{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"dni-plaintext\">572</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div class=\"dni-plaintext\">772</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "List<int> numbers = new List<int>(){ 1, 7, 18, 48, 28, 20, 17, 458 };\n",
    "IEnumerable<int> evenNumbers = numbers.Skip(1).Where(n => n % 2 == 0);\n",
    "DisplayExtensions.Display(evenNumbers.Sum());\n",
    "numbers.Add(200);\n",
    "DisplayExtensions.Display(evenNumbers.Sum());"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">4</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">36</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">144</div></td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Func<int, bool> isEven = n => n % 2 == 0;\n",
    "DisplayExtensions.Display(\n",
    "    new List<int>(){3, 6, 6, 5, 2, 12, 11, 13}.Skip(2).Where(isEven).Select(n => n * n).OrderBy(n => n).ToArray());"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">2</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">3</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">6</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">5</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">12</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">13</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">11</div></td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "DisplayExtensions.Display(\n",
    "    new List<List<int>>(){ new List<int>(){2, 3, 6, 5}, new List<int>(){ 12, 13, 11 } }.SelectMany(l => l).ToArray());"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"dni-plaintext\">55</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div class=\"dni-plaintext\">5</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "List<int> numbers = new List<int>(){3, 6, 2, 5, 6, 12, 11, 13};\n",
    "Func<int, bool> isEven = n => n % 2 == 0;\n",
    "DisplayExtensions.Display(\n",
    "    numbers.Where(isEven)\n",
    "           .Select(n => n * n)\n",
    "           .Average());\n",
    "\n",
    "DisplayExtensions.Display(\n",
    "    numbers.Where(i => i > 4)\n",
    "           .OrderBy(i => i)\n",
    "           .FirstOrDefault());"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">6</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">2</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">6</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">12</div></td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">[ 3, 5, 11, 13 ]</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">[ 6, 2, 12 ]</div></td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">9</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">36</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">4</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">25</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">144</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">121</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">169</div></td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[3;6;2;5;6;12;11;13]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "List<int> numbers = new List<int>(){3, 6, 2, 5, 6, 12, 11, 13};\n",
    "Func<int, bool> isEven = n => n % 2 == 0;\n",
    "\n",
    "DisplayExtensions.Display(\n",
    "    numbers.Where(isEven)\n",
    "        .ToList());\n",
    "\n",
    "DisplayExtensions.Display(\n",
    "    numbers.Distinct()\n",
    "        .GroupBy(i => isEven(i) ? \"Even\" : \"Odd\"));\n",
    "\n",
    "DisplayExtensions.Display(\n",
    "    numbers.Distinct().Select(i => i * i));\n",
    "\n",
    "DisplayExtensions.Display(\n",
    "    $\"[{String.Join(\";\", numbers.ToArray())}]\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Filter: 3\r\n",
      "Filter: 2\r\n",
      "Map: 2 => 4\r\n",
      "Filter: 12\r\n",
      "Map: 12 => 144\r\n",
      "Reduce: aggregate=4 next=144 => 148\r\n",
      "Filter: 5\r\n",
      "Filter: 13\r\n",
      "Filter: 11\r\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div class=\"dni-plaintext\">148</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "DisplayExtensions.Display(\n",
    "    new List<int>(){3, 2, 12, 5, 13, 11}.Select(\n",
    "        (i) =>\n",
    "        {\n",
    "            Console.WriteLine($\"Filter: {i}\");\n",
    "            return i;\n",
    "        })\n",
    "        .Where(i => i % 2 == 0)\n",
    "        .Select(\n",
    "            (i) =>\n",
    "            {\n",
    "                int result = i * i;\n",
    "                Console.WriteLine($\"Map: {i} => {result}\");\n",
    "                return result;\n",
    "            })\n",
    "        .Aggregate(\n",
    "            (sum, nextValue) =>\n",
    "            {\n",
    "                int result = sum + nextValue;\n",
    "                Console.WriteLine($\"Reduce: aggregate={sum} next={nextValue} => {result}\");\n",
    "                return result;\n",
    "            }));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "vscode": {
     "languageId": "dotnet-interactive.csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td>This</td></tr><tr><td>1</td><td>is</td></tr><tr><td>2</td><td>test</td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td>This</td></tr><tr><td>1</td><td>is</td></tr><tr><td>2</td><td>test</td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td>This</td></tr><tr><td>1</td><td>is</td></tr><tr><td>2</td><td>test</td></tr><tr><td>3</td><td>another1</td></tr></tbody></table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "List<string> lines = new List<string>(){\"This\", \"is\", \"a\", \"test\"};\n",
    "IEnumerable<string> linesWithEvenCount = lines.Where(line => line.Length % 2 == 0);\n",
    "DisplayExtensions.Display(linesWithEvenCount);\n",
    "DisplayExtensions.Display(linesWithEvenCount.ToArray());\n",
    "lines.Add(\"another\");\n",
    "lines.Add(\"another1\");\n",
    "DisplayExtensions.Display(linesWithEvenCount.ToArray());"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".NET (C#)",
   "language": "C#",
   "name": ".net-csharp"
  },
  "language_info": {
   "name": "C#"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
