From 2f29b5f8ea040cf0167a45ad8519bcee8483dcc2 Mon Sep 17 00:00:00 2001 From: borb Date: Mon, 30 Jun 2025 18:21:56 +0300 Subject: [PATCH] finish lecture 5 --- 5-arrays-and-lists-slides.html | 226 +++++++++++++++++++++++ 5-arrays-and-lists.md | 322 +++++++++++++++++---------------- imgs/5 Arrays and Lists_2.png | Bin 30728 -> 0 bytes 3 files changed, 389 insertions(+), 159 deletions(-) create mode 100644 5-arrays-and-lists-slides.html delete mode 100644 imgs/5 Arrays and Lists_2.png diff --git a/5-arrays-and-lists-slides.html b/5-arrays-and-lists-slides.html new file mode 100644 index 0000000..31066f0 --- /dev/null +++ b/5-arrays-and-lists-slides.html @@ -0,0 +1,226 @@ +5. Arrays and Lists
+

Arrays and Lists

+
+
+

Overview

+
    +
  • Arrays
  • +
  • Multidimensional arrays
  • +
  • Lists
  • +
  • Iterating a list
  • +
  • Foreach
  • +
+
+
+

Arrays

+
    +
  • Arrays are a collection of variables of the same type
  • +
  • To optimize memory usage, arrays allocate neighbouring memory addresses
  • +
  • A single value in this collection is called an element
  • +
  • Arrays can be declared with square brackets following the type of the elements:
    int[] userIds;
    +
    +
  • +
  • Declaring an array does not yet allocate space from memory
  • +
+
+
+

Initializing arrays

+
    +
  • Initialize an array with a length of 3 using the following syntax:
    int[] userIds = new int[3];
    +
    +
  • +
  • Assign a value to an element in an array by specifying the index in square brackets:
    userIds[0] = 104;
    +
    +
  • +
  • Indexing starts from 0, so the above line assigns a value of 104 to the first element of the array
  • +
+
+
+
    +
  • You can also create an array and instantly populate it with values with one statement:
    string[] names = new string[3] { "Johannes", "Rene", "Ville" };
    +
    +
  • +
  • The same works without specifying the length in the brackets:
    double[] balances = new double[] { 1.3, 200.3, 9332.14 };
    +
    +
  • +
+
+
+

Multidimensional Arrays

+
    +
  • C# supports multidimensional arrays
  • +
  • Here's an example of a two-dimensional array.
  • +
  • You can think of it as an array consisting of arrays
    char[,] letters = new char[3, 4]
    +{
    +  {'a', 'b', 'c', 'd'},
    +  {'e', 'f', 'g', 'h'},
    +  {'i', 'j', 'k', 'l'}
    +};
    +
    +Console.WriteLine(letters[1, 3]);       // Outputs "h"
    +
    +
  • +
+
+
+

Lists

+
    +
  • The .NET Framework Library System.Collections.Generic offers another structure to contain multiple variables: the List class
  • +
  • Importing the library:
    using System.Collections.Generic;
    +
    +
  • +
  • Declaration and initialization:
    List<int> userIds = new List<int>();
    +
    +
  • +
  • Value assignment (exactly like arrays):
    userIds[0] = 22;
    +
    +
  • +
+
+
+

Why lists?

+
    +
  • The key benefit of using Lists lies in its built-in functionalities
    +
  • +
  • You can see a list (heh) of available methods in Visual Studio by following the list variable with a dot
  • +
+
+
+

Arrays vs Lists

+
    +
  • The memory allocation of an array is static a.k.a. fixed, but list memory is dynamic
  • +
  • This allows the flexible mutation of lists, meaning you can always add or remove elements, thus changing the length of the list without issues
    List<int> intList = new List<int>() { 1, 9, 4 };
    +intList.Remove(0); // List is now [9, 4]
    +
    +int[] intArray = new int[] { 1, 9, 4 };
    +intArray.Remove(0);
    +// Can't do that, array is static
    +// and doesn't include such method
    +
    +
  • +
+
+
+

When to use arrays or lists?

+
    +
  • Use arrays when you... +
      +
    • ...need high performance
    • +
    • ...can predetermine the number of elements
    • +
    +
  • +
  • Use lists when you... +
      +
    • ...need to add/remove elements dynamically
    • +
    • ...need the list operations
    • +
    +
  • +
+
+
+

Example: Iterating an array with a for loop

+
+
+
string[] names = new string[]
+{
+  "Harry Potter",
+  "Luke Skywalker",
+  "Harley Quinn"
+};
+
+for (int i = 0; i < names.Length; ++i)
+{
+  Console.WriteLine(names[i]);
+}
+
+
+
+

+
+
+
+
+

Iterating a List

+
    +
  • You can iterate the elements of a list with a for loop the same way as an array
  • +
  • Just use List.Count instead of Array.Length
    List<int> numbers = new List<int>() { 1, 5, 3 };
    +int sum = 0;
    +for (int i = 0; i < numbers.Count; ++i)
    +{
    +  sum += numbers[i];
    +}
    +// sum is now 9
    +
    +
  • +
+
+
+

foreach Statement

+
    +
  • There is one more statement to use to iterate arrays and lists: the foreach statement
  • +
  • foreach is useful when you have to execute code for each element of an array or a list, and don't need the corresponding index:
  • +
+
+
+
string[] names = new string[]
+{
+  "Harry Potter",
+  "Luke Skywalker",
+  "Harley Quinn"
+};
+
+foreach (string name in names)
+{
+  Console.WriteLine(name);
+}
+
+
+
+

+
+
+
+
+

Note about foreach

+
    +
  • However, foreach creates a copy of each element in the object so the element cannot be mutated directly:
    +
  • +
  • Performance-wise, using foreach is also more costly because it uses more memory space
  • +
  • If you need to change every element, consider creating a new list instead
  • +
+
+
+

Exercise 1: Expanding the Console Application

+ +
    +
  1. Continue working on the command line application you created in Lecture 4, Exercise 1: The Main Loop . Add a new command add which prompts the user to write a note.
  2. +
  3. After the user has inputted the note, save it to a list, and return back to listening to commands.
  4. +
  5. Add another command list which prints all the saved notes.
  6. +
  7. Add one more command remove which prints all the saved notes with the index of the note, and then prompts the user for a number. After entering the number the note with the corresponding index is deleted from the list.
  8. +
+
    +
  • Note: you can use the int.Parse() method to parse the user input string to an integer
  • +
+
+
+

Assignments

+

Assignments about this topic can be found here

+
+
\ No newline at end of file diff --git a/5-arrays-and-lists.md b/5-arrays-and-lists.md index 957ca00..7e02e61 100644 --- a/5-arrays-and-lists.md +++ b/5-arrays-and-lists.md @@ -1,204 +1,208 @@ -# Arrays and Lists - -![](imgs/5%20Arrays%20and%20Lists_0.png) - +--- +marp: true +paginate: true +math: mathjax +theme: buutti +title: 5. Arrays and Lists --- -# Overview - -Arrays - -Multidimensional Arrays - -Lists - -Iterating a List - -Foreach - -# Arrays - -Arrays are a collection of variables of the same type, which allocate neighboring memory locations - -A single value in this collection is called an __element__ - -Arrays can be __declared __ with square brackets following the type of the elements: - -int[] userIds; - -Declaring an array does not yet allocate space from memory - -# Arrays (continued) - -__Initialize __ an array with a length of 3 using the following syntax: - -int[] userIds = new int[3]; - -__Assign a value__ to an element in an array by specifying the index in square brackets: - -userIds[0] = 104; - -Indexing starts from 0, so the above line assigns a value of 104 to the first element of the array - -You can also create an array containing values with one statement: - -string[] names = new string[3] { "Johannes", "Rene", "Ville" }; - -The same works without specifying the length in the brackets: - -double[] balances = new double[] { 1.3, 200.3, 9332.14 }; - -# Multidimensional Arrays - -C# supports multidimensional arrays: - -char[,] letters = new char[3, 4] - -{ - -{'a', 'b', 'c', 'd'}, - -{'e', 'f', 'g', 'h'}, - -{'i', 'j', 'k', 'l'} - -}; - -Console.WriteLine(letters[1, 3]); // Outputs "h" - -# Lists - -The .NET Framework Class Library offers another way to hold multiple variables: the _List _ object - -Declaration and initialization: - -List userIds = new List(); - -Value assignment: - -userIds[0] = 22; - -# Lists (continued) - -The key benefit of using Lists lies in its built-in functionalities - -![](imgs/5%20Arrays%20and%20Lists_1.png) - -You can see a list of available methods in VSC2019 by following a variable with a dot - -# Arrays vs Lists +# Arrays and Lists -The memory allocation of an array is static/fixed, but list memory is dynamic + + -This allows the flexible mutation of lists, meaning you can always add or remove and hence change change the length of the list without issues +## Overview -![](imgs/5%20Arrays%20and%20Lists_2.png) +* Arrays +* Multidimensional arrays +* Lists +* Iterating a list +* Foreach -# Arrays vs Lists (continued) +## Arrays -When to use arrays and when lists? +* Arrays are a collection of variables of the same type +* To optimize memory usage, arrays allocate neighbouring memory addresses +* A single value in this collection is called an *__element__* +* Arrays can be *__declared__* with square brackets following the type of the elements: + ```csharp + int[] userIds; + ``` +* Declaring an array does not yet allocate space from memory -Use __arrays __ if you need __high performance__ +### Initializing arrays -Use __lists __ if you need support for __list operations__ +* *__Initialize__* an array with a length of 3 using the following syntax: + ```csharp + int[] userIds = new int[3]; + ``` +* *__Assign a value__* to an element in an array by specifying the index in square brackets: + ```csharp + userIds[0] = 104; + ``` +* Indexing starts from 0, so the above line assigns a value of `104` to the ***first*** element of the array -# Iterating an Array With for Loop - Example +--- +* You can also create an array and instantly populate it with values with one statement: + ```csharp + string[] names = new string[3] { "Johannes", "Rene", "Ville" }; + ``` +* The same works without specifying the length in the brackets: + ```csharp + double[] balances = new double[] { 1.3, 200.3, 9332.14 }; + ``` + +## Multidimensional Arrays + +* C# supports multidimensional arrays +* Here's an example of a two-dimensional array. +* You can think of it as an array consisting of arrays + ```csharp + char[,] letters = new char[3, 4] + { + {'a', 'b', 'c', 'd'}, + {'e', 'f', 'g', 'h'}, + {'i', 'j', 'k', 'l'} + }; + + Console.WriteLine(letters[1, 3]); // Outputs "h" + ``` + +## Lists + +* The .NET Framework Library [`System.Collections.Generic`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic?view=net-9.0) offers another structure to contain multiple variables: the [List](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=net-9.0) class +* Importing the library: + ```csharp + using System.Collections.Generic; + ``` +* Declaration and initialization: + ```csharp + List userIds = new List(); + ``` +* Value assignment (exactly like arrays): + ```csharp + userIds[0] = 22; + ``` + +### Why lists? + +* The key benefit of using Lists lies in its built-in functionalities + ![](imgs/5%20Arrays%20and%20Lists_1.png) +* You can see a list (heh) of available methods in Visual Studio by following the list variable with a dot + +## Arrays vs Lists + +* The memory allocation of an array is ***static*** a.k.a. fixed, but list memory is ***dynamic*** +* This allows the flexible mutation of lists, meaning you can always add or remove elements, thus changing the length of the list without issues + ```csharp + List intList = new List() { 1, 9, 4 }; + intList.Remove(0); // List is now [9, 4] + + int[] intArray = new int[] { 1, 9, 4 }; + intArray.Remove(0); + // Can't do that, array is static + // and doesn't include such method + ``` + +### When to use arrays or lists? + +* Use arrays when you... + * ...need high performance + * ...can predetermine the number of elements +* Use lists when you... + * ...need to add/remove elements dynamically + * ...need the list operations + +## Example: Iterating an array with a for loop + +
+
+ +```csharp string[] names = new string[] - { - -"Harry Potter", - -"Luke Skywalker", - -"Harley Quinn" - + "Harry Potter", + "Luke Skywalker", + "Harley Quinn" }; -for(int i = 0; i < names.Length; ++i) - +for (int i = 0; i < names.Length; ++i) { - -Console.WriteLine(names[i]); - + Console.WriteLine(names[i]); } +``` -![](imgs/5%20Arrays%20and%20Lists_3.png) - -# Iterating a List - -You can iterate the elements of a list with a for loop the same way as an array - -Just use List.Count instead of Array.Length - -List numbers = new List() { 1, 5, 3 }; - -int sum = 0; +
+
-for (int i = 0; i < numbers.Count; ++i) +![](imgs/5%20Arrays%20and%20Lists_3.png) -{ +
+
-sum += numbers[i]; +## Iterating a List -} +* You can iterate the elements of a list with a for loop the same way as an array +* Just use `List.Count` instead of `Array.Length` + ```csharp + List numbers = new List() { 1, 5, 3 }; + int sum = 0; + for (int i = 0; i < numbers.Count; ++i) + { + sum += numbers[i]; + } + // sum is now 9 + ``` -// sum is now 9 +## `foreach` Statement -# foreach Statement +* There is one more statement to use to iterate arrays and lists: the `foreach` statement +* `foreach` is useful when you have to execute code for each element of an array or a list, and don't need the corresponding index: -There is one more statement to use to iterate arrays and lists: the foreach statement - -foreach is useful when you have to execute code for each element of an array or a list: +
+
+```csharp string[] names = new string[] - { - -"Harry Potter", - -"Luke Skywalker", - -"Harley Quinn" - + "Harry Potter", + "Luke Skywalker", + "Harley Quinn" }; foreach (string name in names) - { - -Console.WriteLine(name); - + Console.WriteLine(name); } +``` -![](imgs/5%20Arrays%20and%20Lists_4.png) - -# foreach Statement (continued) - -However, foreach creates a copy of each element in the object so the element cannot be mutated directly: +
+
-![](imgs/5%20Arrays%20and%20Lists_5.png) - -Performance-wise, using foreach is also more costly because it uses more memory space - ---- - -Instead, create a new list +![](imgs/5%20Arrays%20and%20Lists_4.png) -# Exercise 1: Expanding the Console Application +
+
-Continue working on the command line application you created in "The Main Loop" exercise. Add a new command "add" which prompts the user to write a note. +### Note about `foreach` -After the user has inputted the note, it is saved to a list, and the program returns back to listening to commands. +* However, `foreach` creates a copy of each element in the object so the element cannot be mutated directly: + ![](imgs/5%20Arrays%20and%20Lists_5.png) +* Performance-wise, using foreach is also more costly because it uses more memory space +* If you need to change every element, consider creating a new list instead -Add another command "list" which prints all the saved notes. +## Exercise 1: Expanding the Console Application + -Add one more command "remove" which prints all the saved notes with the index of the note, and then prompts the user for a number. After entering the number the corresponding note is deleted from the list. +1) Continue working on the command line application you created in [Lecture 4, Exercise 1: The Main Loop ](4-loops#exercise-1-the-main-loop). Add a new command `add` which prompts the user to write a note. +2) After the user has inputted the note, save it to a list, and return back to listening to commands. +3) Add another command `list` which prints all the saved notes. +4) Add one more command `remove` which prints all the saved notes with the index of the note, and then prompts the user for a number. After entering the number the note with the corresponding index is deleted from the list. -( __Note__ : you can use int.Parse() -method to parse the user input string to an integer) +* *__Note__*: you can use the `int.Parse()` method to parse the user input string to an integer -# Assignments +## Assignments [Assignments about this topic can be found here](https://gitea.buutti.com/education/academy-assignments/src/branch/master/C%23%20Basics/5.%20Arrays%20&%20Lists) diff --git a/imgs/5 Arrays and Lists_2.png b/imgs/5 Arrays and Lists_2.png deleted file mode 100644 index 46e8df9827473709be8a9e6d2ad57b601c5887a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30728 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