/
aprogrammer
/
dotnet-docs
Обзор
Документация
Войти
/
aprogrammer
/
dotnet-docs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
docs/csharp/linq/snippets/HowToFilesAndDirectories/SumColumns.cs
117 строк
4 KB
Bill Wagner
Finish freshness update / reorg on LINQ content (#40437)
24 апр 2024, 20:59
Не верифицирован
24 апр 2024, 20:59
bc2d72c
Код
Авторство
О чём код?
namespace HowToFilesAndDirectories; // <SumColumns> public class SumColumns { public static void SumCSVColumns(string fileName) { string[] lines = File.ReadAllLines(fileName); // Specifies the column to compute. int exam = 3; // Spreadsheet format: // Student ID Exam#1 Exam#2 Exam#3 Exam#4 // 111, 97, 92, 81, 60 // Add one to exam to skip over the first column, // which holds the student ID. SingleColumn(lines, exam + 1); Console.WriteLine(); MultiColumns(lines); } static void SingleColumn(IEnumerable<string> strs, int examNum) { Console.WriteLine("Single Column Query:"); // Parameter examNum specifies the column to // run the calculations on. This value could be // passed in dynamically at run time. // Variable columnQuery is an IEnumerable<int>. // The following query performs two steps: // 1) use Split to break each row (a string) into an array // of strings, // 2) convert the element at position examNum to an int // and select it. var columnQuery = from line in strs let elements = line.Split(',') select Convert.ToInt32(elements[examNum]); // Execute the query and cache the results to improve // performance. This is helpful only with very large files. var results = columnQuery.ToList(); // Perform aggregate calculations Average, Max, and // Min on the column specified by examNum. double average = results.Average(); int max = results.Max(); int min = results.Min(); Console.WriteLine($"Exam #{examNum}: Average:{average:##.##} High Score:{max} Low Score:{min}"); } static void MultiColumns(IEnumerable<string> strs) { Console.WriteLine("Multi Column Query:"); // Create a query, multiColQuery. Explicit typing is used // to make clear that, when executed, multiColQuery produces // nested sequences. However, you get the same results by // using 'var'. // The multiColQuery query performs the following steps: // 1) use Split to break each row (a string) into an array // of strings, // 2) use Skip to skip the "Student ID" column, and store the // rest of the row in scores. // 3) convert each score in the current row from a string to // an int, and select that entire sequence as one row // in the results. var multiColQuery = from line in strs let elements = line.Split(',') let scores = elements.Skip(1) select (from str in scores select Convert.ToInt32(str)); // Execute the query and cache the results to improve // performance. // ToArray could be used instead of ToList. var results = multiColQuery.ToList(); // Find out how many columns you have in results. int columnCount = results[0].Count(); // Perform aggregate calculations Average, Max, and // Min on each column. // Perform one iteration of the loop for each column // of scores. // You can use a for loop instead of a foreach loop // because you already executed the multiColQuery // query by calling ToList. for (int column = 0; column < columnCount; column++) { var results2 = from row in results select row.ElementAt(column); double average = results2.Average(); int max = results2.Max(); int min = results2.Min(); // Add one to column because the first exam is Exam #1, // not Exam #0. Console.WriteLine($"Exam #{column + 1} Average: {average:##.##} High Score: {max} Low Score: {min}"); } } } /* Output: Single Column Query: Exam #4: Average:76.92 High Score:94 Low Score:39 Multi Column Query: Exam #1 Average: 86.08 High Score: 99 Low Score: 35 Exam #2 Average: 86.42 High Score: 94 Low Score: 72 Exam #3 Average: 84.75 High Score: 91 Low Score: 65 Exam #4 Average: 76.92 High Score: 94 Low Score: 39 */ // </SumColumns>