# Store and iterate through sequences of data using Arrays and the foreach statement in C# Work with sequences of related data in data structures known as arrays. Then, learn to iterate through each item in the sequence. ### Learning objectives In this module, you will: - Create and initialize a new array. - Set and get values in arrays. - Iterate through each element of an array using the foreach statement. #### Prerequisites - Experience with declaring and initializing variables and basic data types like string. - Experience with printing to output using `Console.WriteLine()`. - Experience with string interpolation to combine literal strings with variable data. - Experience researching how to use methods from the .NET Class Library. ## Introduction C# arrays allow you to store sequences of values in a single data structure. In other words, imagine a single variable that can hold many values. Once you have a single variable that stores all the values, you can sort the values, reverse the order of the values, loop through each value and inspect it individually, and so on. Suppose you work in the security department of a company that matches online sellers with commission-based advertisers. You've been asked to write C# code that will iterate through the Order IDs of incoming orders. You need to inspect each Order ID to identify orders that may be fraudulent. You'll need to implement arrays to accomplish this programming task. In this module, you'll create and initialize arrays. You'll set and retrieve values from elements in an array accessing each element using its index. You'll create looping logic that allows you to work with each element in an array. By the end of this module, you'll have worked with your first structure to hold multiple data values. Later, in other modules, you'll learn how to sort, filter, query, aggregate, and perform other operations on your data. --- ## Exercise ### Get started with array basics Arrays can be used to store multiple values of the same type in a single variable. The values stored in an array are generally related. For example, a list of student names could be stored in a string array named students. Your work in the security department is focused on finding a pattern for fraudulent orders. You want your code to review past customer orders and identify markers associated with fraudulent orders. Your company hopes the markers can be used to identify potential fraudulent purchase orders in the future before they're processed. Since you don't always know in advance how many orders you need to review, you can't create individual variables to hold each Order ID. How can you create a data structure to hold multiple related values? In this exercise, you use arrays to store and analyze a sequence of Order IDs. ### What is an array? An array is a sequence of individual data elements accessible through a single variable name. You use a zero-based numeric index to access each element of an array. As you can see, arrays allow you to collect together similar data that shares a common purpose or characteristics in a single data structure for easier processing. ### Declaring arrays and accessing array elements An array is a special type of variable that can hold multiple values of the same data type. The declaration syntax is slightly different because you have to specify both the data type and the size of the array. #### Prepare your coding environment This module includes activities that guide you through the process of building and running sample code. You're encouraged to complete these activities using Visual Studio Code as your development environment. Using Visual Studio Code for these activities helps you to become more comfortable writing and running code in a developer environment that's used by professionals worldwide. At the Terminal command prompt, to create a new console application in a specified folder, type: ```powershell dotnet new console -o ./path_to/project ``` You can use this C# console project to create, build, and run code samples during this module. ### Declare a new array To declare a new array of strings that can hold three elements, enter the following code: ```cs string[] fraudulentOrderIDs = new string[3]; ``` Take a minute to examine your code. The `new` operator creates a new instance of an array in the computer's memory that can hold three string values. For more information about the `new` keyword, see the module "Call methods from the .NET Class Library using C#". Notice that the first set of square brackets `[]` merely tells the compiler that the variable named `fraudulentOrderIDs` is an array, but the second set of square brackets `[3]` indicates the number of elements that the array can hold. > Note > This example demonstrates how to declare an array of strings, however, you can create an array of every data type including primitives like int and bool as well as more complex data types like classes. This example uses the simplicity of strings to minimize the number of new ideas you need to grasp as you're getting started. #### Assign values to elements of an array At this point, you've declared an array of strings, but each element of the array is empty. To access an element of an array, you use a numeric zero-based index inside of square brackets. You can assign a value to an array element using the = as if it were a regular variable. To assign Order ID values to your fraudulentOrderIDs array, update your code as follows: ```cs string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; ``` Take a minute to examine your code. Notice that you're using the name of the array to access array elements. Each element is accessed individually by specifying zero-based index number inside the square brackets. Since your array is declared as a string, the values that you assign must also be strings. In this scenario, you're assigning Order IDs to the elements of the array. #### Attempt to use an index that is out of bounds of the array It might not seem intuitive at first, but it's important to remember that you 're declaring the count of elements in the array. However, you access each element of the array starting with zero. So, to access the second item in the array, you use index `1`. It's common for beginners to forget that arrays are zero-based and attempt to access an element of the array that doesn't exist. If you make this mistake, a runtime exception occurs informing you that you attempted to access an element that is outside the boundary of the array. To intentionally "break" your application, attempt to access a fourth element of your array using index value of `3`. At the bottom of your code file, enter the following code line: ```cs fraudulentOrderIDs[3] = "D000"; ``` Ensure that your code matches this example: ```cs string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; fraudulentOrderIDs[3] = "D000"; ``` At the Terminal command prompt, to compile your code, type `dotnet build` and then press Enter. You should see the following message: ```txt Build succeeded. 0 Warning(s) 0 Error(s) ``` At the Terminal command prompt, to run your code, type `dotnet run` and then press Enter. When you run the app, you get the following runtime error message: ```txt Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array. at Program.
$(String[] args) in C:\Users\someuser\Desktop\CsharpProjects\TestProject\Program.cs:line 6 ``` Notice the following parts of the error: - Error message: `System.IndexOutOfRangeException: Index was outside the bounds of the array.` - Error location: `Program.cs:line 6` Comment out the line that generated the runtime error.  ```cs // fraudulentOrderIDs[3] = "D000"; ``` You've seen how to assign a value to an array element. Now look at how to access a value that's being stored in an array element. #### Retrieve values from elements of an array Accessing the value of an array element works the same way as assigning a value to an array element. You just specify the index of the element whose value you want to retrieve. To write the value of each fraudulent Order ID, update your code as follows: ```cs string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; // fraudulentOrderIDs[3] = "D000"; Console.WriteLine($"First: {fraudulentOrderIDs[0]}"); Console.WriteLine($"Second: {fraudulentOrderIDs[1]}"); Console.WriteLine($"Third: {fraudulentOrderIDs[2]}"); ``` At the Terminal command prompt, type `dotnet run` and then press Enter. You should see the following message: ```txt First: A123 Second: B456 Third: C789 ``` #### Reassign the value of an array The elements of an array are just like any other variable value. You can assign, retrieve, and reassign a value to each element of the array. At the end of your code file, to reassign and then print the value of the first array element, enter the following code: ```cs fraudulentOrderIDs[0] = "F000"; Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}"); ``` Ensure that your code matches the following example: ```cs string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; // fraudulentOrderIDs[3] = "D000"; Console.WriteLine($"First: {fraudulentOrderIDs[0]}"); Console.WriteLine($"Second: {fraudulentOrderIDs[1]}"); Console.WriteLine($"Third: {fraudulentOrderIDs[2]}"); fraudulentOrderIDs[0] = "F000"; Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}"); ``` At the Terminal command prompt, type `dotnet run` and then press Enter. You should see the following message: ```txt First: A123 Second: B456 Third: C789 Reassign First: F000 ``` #### Initialize an array You can initialize an array during declaration just like you would a regular variable. However, to initialize the elements of the array, you use a special syntax featuring curly braces. Comment out the lines where you declare the `fraudulentOrderIDs` variable. You can use a multi-line comment (`/* ... */`) to comment out the declaration of `fraudulentOrderIDs` and the lines used to assign values to the array elements. To declare the array initialize values in a single statement, enter the following code: ```cs string[] fraudulentOrderIDs = { "A123", "B456", "C789" }; ``` Ensure that your code matches the following example: ```cs /* string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; // fraudulentOrderIDs[3] = "D000"; */ string[] fraudulentOrderIDs = { "A123", "B456", "C789" }; Console.WriteLine($"First: {fraudulentOrderIDs[0]}"); Console.WriteLine($"Second: {fraudulentOrderIDs[1]}"); Console.WriteLine($"Third: {fraudulentOrderIDs[2]}"); fraudulentOrderIDs[0] = "F000"; Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}"); ``` Take a minute to examine the declaration statement. Notice that this syntax is both compact and easy to read. When you run the application, there should be no change to the output. At the Terminal command prompt, type `dotnet run` and then press Enter. You should see the same message as before: ```txt First: A123 Second: B456 Third: C789 Reassign First: F000 ``` #### Use the Length property of an array Depending on how the array is created, you may not know in advance how many elements an array contains. To determine the size of an array, you can use the Length property. > Note > The Length property of an array is not zero-based. At the end of your code file, to report the number of fraudulent orders, enter the following code: ```cs Console.WriteLine($"There are {fraudulentOrderIDs.Length} fraudulent orders to process."); ``` This code uses the array's `Length` property, an integer, to return the number of elements in your `fraudulentOrderIDs` array. Ensure that your code matches this example: ```cs /* string[] fraudulentOrderIDs = new string[3]; fraudulentOrderIDs[0] = "A123"; fraudulentOrderIDs[1] = "B456"; fraudulentOrderIDs[2] = "C789"; // fraudulentOrderIDs[3] = "D000"; */ string[] fraudulentOrderIDs = { "A123", "B456", "C789" }; Console.WriteLine($"First: {fraudulentOrderIDs[0]}"); Console.WriteLine($"Second: {fraudulentOrderIDs[1]}"); Console.WriteLine($"Third: {fraudulentOrderIDs[2]}"); fraudulentOrderIDs[0] = "F000"; Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}"); Console.WriteLine($"There are {fraudulentOrderIDs.Length} fraudulent orders to process."); ``` Save the changes to your Program.cs file, and then run the application. You should see the following output: ```txt First: A123 Second: B456 Third: C789 Reassign First: F000 There are 3 fraudulent orders to process. ``` ### Recap Here's the most important things to remember when working with arrays: - An array is a special variable that holds a sequence of related data elements. - You should memorize the basic format of an array variable declaration. - Access each element of an array to set or get its values using a zero-based index inside of square brackets. - If you attempt to access an index outside of the boundary of the array, you get a run time exception. - The Length property gives you a programmatic way to determine the number of elements in an array. --- ## Exercise ### Implement the foreach statement Suppose you work for a manufacturing company. The company needs you to complete an inventory of your warehouse to determine the number of products that are ready to ship. In addition to the total number of finished products, you need to report the number of finished products stored in each individual bin in your warehouse, along with a running total. This running total will be used to create an audit trail so you can double-check your work and identify "shrinkage". ### Looping through an array using foreach The `foreach` statement provides a simple, clean way to iterate through the elements of an array. The `foreach` statement processes array elements in increasing index order, starting with index 0 and ending with index Length - 1. It uses a temporary variable to hold the value of the array element associated with the current iteration. Each iteration will run the code block that's located below the `foreach` declaration. Here's a simple example: ```cs string[] names = { "Rowena", "Robin", "Bao" }; foreach (string name in names){ Console.WriteLine(name); } ``` Below the foreach keyword, the code block that contains the `Console.WriteLine(name);` will execute once for each element of the `names` array. As the .NET runtime loops through each element of the array, the value stored in the current element of the `names` array is assigned to the temporary variable `name` for easy access inside of the code block. If you ran the code, you would see the following result. ```txt Rowena Robin Bao ``` Use the foreach statement to create a sum of all the items on hand in each bin of your warehouse. #### Create and initialize an array of int To create an array of type int that stores the number of finished products in each bin, enter the following code: ```cs int[] inventory = { 200, 450, 700, 175, 250 }; ``` #### Add a foreach statement to iterate through the array To create a `foreach` statement that iterates through each element of the `inventory` array, enter the following code: ```cs foreach (int items in inventory){ } ``` Notice that the `foreach` statement temporarily assigns the value of the current array element to an `int` variable named `items`. Ensure that your code matches the following: ```cs int[] inventory = { 200, 450, 700, 175, 250 }; foreach (int items in inventory){ } ``` #### Add a variable to sum the value of each element in the array Position the cursor on the blank code line above the `foreach` statement. To declare a new variable that represents the sum of all finished products in your warehouse, enter the following code: ```cs int sum = 0; ``` Ensure that you declare the variable outside of the `foreach` statement. Position the cursor inside the code block of the `foreach` statement. To add the current value stored in `items` to the `sum` variable, enter the following code: ```cs sum += items; ``` Ensure your code matches the following: ```cs int[] inventory = { 200, 450, 700, 175, 250 }; int sum = 0; foreach (int items in inventory){ sum += items; } ``` #### Display the final value of sum Create a blank code line below the code block of the `foreach` statement. To report the final sum of items in your inventory, enter the following code: ```cs Console.WriteLine($"We have {sum} items in inventory."); ``` Ensure that your code matches the following: ```cs int[] inventory = { 200, 450, 700, 175, 250 }; int sum = 0; foreach (int items in inventory){ sum += items; } Console.WriteLine($"We have {sum} items in inventory."); ``` At the Terminal command prompt, type `dotnet run` and then press Enter. ```txt We have 1775 items in inventory. ``` #### Create a variable to hold the current bin number and display the running total To fulfill the final requirement of your inventory reporting project, you'll need to create a variable that will hold the current iteration of the `foreach` statement so you can display the bin and the count of finished items in that bin, along with the running total of all items of bins accounted for so far. Create a blank code line above the `foreach` statement. To declare `int` variable named `bin` that's initialized to `0`, enter the following code: ```cs int bin = 0; ``` You will use `bin` to store the number of the bin whose inventory is currently being processed. Inside the `foreach` code block, to increment `bin` each time the code block is executed, enter the following code: ```cs bin++; ``` Notice that you use the `++` operator to increment the value of the variable by `1`. This is a shortcut for `bin = bin + 1`. To report the bin number, the number of finished products in the bin, and the running total of finished products, enter the following code inside the `foreach` code block, after `bin++;`: ```cs Console.WriteLine($"Bin {bin} = {items} items (Running total: {sum})"); ``` This code will use your counter variable bin, the temporary foreach variable items, and your sum variable to report the current state of your inventory in a nicely formatted message. Ensure that your code matches the following: ```cs int[] inventory = { 200, 450, 700, 175, 250 }; int sum = 0; int bin = 0; foreach (int items in inventory){ sum += items; bin++; Console.WriteLine($"Bin {bin} = {items} items (Running total: {sum})"); } Console.WriteLine($"We have {sum} items in inventory."); ``` Save the changes to your Program.cs file, and then run the application. You should see the following output: ```cs Bin 1 = 200 items (Running total: 200) Bin 2 = 450 items (Running total: 650) Bin 3 = 700 items (Running total: 1350) Bin 4 = 175 items (Running total: 1525) Bin 5 = 250 items (Running total: 1775) We have 1775 items in inventory. ``` ### Recap Here's a few things to remember about `foreach` statements and incrementing values that you learned in this unit: - Use the `foreach` statement to iterate through each element in an array, executing the associated code block once for each element in the array. - The `foreach` statement sets the value of the current element in the array to a temporary variable, which you can use in the body of the code block. - Use the `++` increment operator to add 1 to the current value of a variable. --- ## Exercise ### Complete a challenge activity for nested iteration and selection statements Code challenges reinforce what you've learned and help you gain some confidence before continuing on. ### Fraudulent order challenge Earlier in this module, you set out to write code that would store Order IDs belonging to potentially fraudulent orders. Your goal is to find fraudulent orders as early as possible and flag them for deeper analysis. ### Code challenge **Report the Order IDs that need further investigation** Your team has found a pattern. Orders that start with the letter "B" encounter fraud at a rate 25 times greater than the normal rate. You write new code that outputs the Order ID of new orders where the Order ID starts with the letter "B". This will be used by the fraud team to investigate further. Use the following steps to complete this challenge. Declare an array and initialize it to contain the following elements: ```txt B123 C234 A345 C15 B177 G3003 C235 B179 ``` These values represent the fraudulent Order ID data that your application use. Create a `foreach` statement to iterate through each element of your array. Report the Order IDs that start with the letter "B". You need to evaluate each element of the array. Report the potentially fraudulent Order IDs by detecting the orders that start with the letter "B". To determine whether or not an element starts with the letter "B", use the `String.StartsWith()` method. Here's a simple example of how to use the `String.StartsWith()` method that you can adapt for your code: ```cs string name = "Bob"; if (name.StartsWith("B")){ Console.WriteLine("The name starts with 'B'!"); } ``` Your output should match the following: ```txt B123 B177 B179 ``` > Tip > Here's a hint: As you loop through each element in your array, you'll need an `if` statement. The `if` statement will need to use a method on the string class to determine if a string starts with a specific letter. If you're not sure how to use an `if` statement, please see the module "Add decision logic to your code using the if-elseif-else statement in C#". ---