Elysia Tools
Navigation mobile
C#
Structures de Données Windows - Exemples C#
Exemples complets de structures de données C# pour plateforme Windows incluant tableaux, listes, dictionnaires, files, piles et collections
Exemples
Entrées de cette collection
Opérations et Manipulation de Tableaux
Création, manipulation, recherche, tri et opérations avancées de tableaux en C#
Difficulté
3/10
Temps estimé
20 min
Étiquettes
csharp, array, data structures, collections, windows
Prérequis
Basic C# syntax, LINQ basics
using System;
using System.Linq;
class ArrayOperations
{
// 1. Array declaration and initialization
public static void ArrayBasics()
{
Console.WriteLine("=== Array Basics ===");
// Different ways to create arrays
int[] numbers1 = new int[5]; // Array with default values
int[] numbers2 = { 1, 2, 3, 4, 5 }; // Array initializer
int[] numbers3 = new int[] { 10, 20, 30, 40, 50 }; // Explicit array creation
Console.WriteLine("Default initialized array:");
PrintArray(numbers1);
Console.WriteLine("\nInitializer array:");
PrintArray(numbers2);
Console.WriteLine("\nExplicit array:");
PrintArray(numbers3);
}
// 2. Multi-dimensional arrays
public static void MultiDimensionalArrays()
{
Console.WriteLine("\n=== Multi-dimensional Arrays ===");
// 2D array
int[,] matrix2D = new int[3, 4]
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
Console.WriteLine("2D Array (3x4):");
for (int i = 0; i < matrix2D.GetLength(0); i++)
{
for (int j = 0; j < matrix2D.GetLength(1); j++)
{
Console.Write($"{matrix2D[i, j],3}");
}
Console.WriteLine();
}
// 3D array
int[,,] cube3D = new int[2, 2, 2]
{
{ { 1, 2 }, { 3, 4 } },
{ { 5, 6 }, { 7, 8 } }
};
Console.WriteLine("\n3D Array (2x2x2):");
for (int x = 0; x < 2; x++)
{
Console.WriteLine($"Layer {x}:");
for (int y = 0; y < 2; y++)
{
for (int z = 0; z < 2; z++)
{
Console.Write($"{cube3D[x, y, z],3}");
}
Console.WriteLine();
}
Console.WriteLine();
}
}
// 3. Jagged arrays (array of arrays)
public static void JaggedArrays()
{
Console.WriteLine("=== Jagged Arrays ===");
// Create jagged array
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2, 3 };
jagged[1] = new int[] { 4, 5, 6, 7 };
jagged[2] = new int[] { 8, 9 };
Console.WriteLine("Jagged array:");
for (int i = 0; i < jagged.Length; i++)
{
Console.Write($"Row {i}: ");
for (int j = 0; j < jagged[i].Length; j++)
{
Console.Write($"{jagged[i][j]} ");
}
Console.WriteLine();
}
// Alternative initialization
int[][] jagged2 =
{
new int[] { 1, 2 },
new int[] { 3, 4, 5 },
new int[] { 6, 7, 8, 9 }
};
Console.WriteLine("\nAlternative jagged array:");
PrintJaggedArray(jagged2);
}
// 4. Array manipulation operations
public static void ArrayManipulation()
{
Console.WriteLine("\n=== Array Manipulation ===");
int[] numbers = { 5, 2, 8, 1, 9, 3, 7, 4, 6 };
Console.WriteLine("Original array:");
PrintArray(numbers);
// Sort array
Array.Sort(numbers);
Console.WriteLine("\nSorted array:");
PrintArray(numbers);
// Reverse array
Array.Reverse(numbers);
Console.WriteLine("\nReversed array:");
PrintArray(numbers);
// Copy array
int[] copy = new int[numbers.Length];
Array.Copy(numbers, copy, numbers.Length);
Console.WriteLine("\nCopied array:");
PrintArray(copy);
// Resize array
Array.Resize(ref copy, 12);
Console.WriteLine("\nResized array (to 12 elements):");
PrintArray(copy);
// Clear portion of array
Array.Clear(copy, 5, 5);
Console.WriteLine("\nArray after clearing elements 5-9:");
PrintArray(copy);
}
// 5. Array searching and finding
public static void ArraySearching()
{
Console.WriteLine("\n=== Array Searching ===");
int[] numbers = { 10, 25, 30, 45, 50, 65, 80, 95, 100 };
Console.WriteLine("Array:");
PrintArray(numbers);
// Linear search using built-in method
int target = 50;
int index = Array.IndexOf(numbers, target);
Console.WriteLine($"\nIndex of {target}: {index}");
// Find all elements greater than 50
var greaterThan50 = numbers.Where(n => n > 50).ToArray();
Console.WriteLine($"Elements greater than 50: [{string.Join(", ", greaterThan50)}]");
// Binary search (requires sorted array)
Array.Sort(numbers);
int binaryIndex = Array.BinarySearch(numbers, 65);
Console.WriteLine($"\nBinary search for 65 in sorted array: {binaryIndex}");
// Find min and max
int min = numbers.Min();
int max = numbers.Max();
Console.WriteLine($"Min: {min}, Max: {max}");
}
// 6. Advanced array operations
public static void AdvancedArrayOperations()
{
Console.WriteLine("\n=== Advanced Array Operations ===");
// Create arrays for demonstration
int[] array1 = { 1, 2, 3, 4, 5 };
int[] array2 = { 4, 5, 6, 7, 8 };
Console.WriteLine("Array 1:");
PrintArray(array1);
Console.WriteLine("Array 2:");
PrintArray(array2);
// Array operations with LINQ
var union = array1.Union(array2).ToArray();
Console.WriteLine($"
Union: [{string.Join(", ", union)}]");
var intersection = array1.Intersect(array2).ToArray();
Console.WriteLine($"Intersection: [{string.Join(", ", intersection)}]");
var difference = array1.Except(array2).ToArray();
Console.WriteLine($"Array1 - Array2: [{string.Join(", ", difference)}]");
var concat = array1.Concat(array2).ToArray();
Console.WriteLine($"Concatenation: [{string.Join(", ", concat)}]");
// Distinct elements
int[] withDuplicates = { 1, 2, 2, 3, 3, 3, 4, 5 };
var distinct = withDuplicates.Distinct().ToArray();
Console.WriteLine($"\nOriginal with duplicates: [{string.Join(", ", withDuplicates)}]");
Console.WriteLine($"Distinct: [{string.Join(", ", distinct)}]");
}
// 7. Array projection and transformation
public static void ArrayTransformation()
{
Console.WriteLine("\n=== Array Transformation ===");
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Console.WriteLine("Original array:");
PrintArray(numbers);
// Square each element
var squares = numbers.Select(n => n * n).ToArray();
Console.WriteLine($"\nSquares: [{string.Join(", ", squares)}]");
// Even numbers only
var evens = numbers.Where(n => n % 2 == 0).ToArray();
Console.WriteLine($"Even numbers: [{string.Join(", ", evens)}]");
// Group by parity
var grouped = numbers.GroupBy(n => n % 2)
.ToDictionary(g => g.Key == 0 ? "Even" : "Odd", g => g.ToArray());
Console.WriteLine("\nGrouped by parity:");
foreach (var group in grouped)
{
Console.WriteLine($"{group.Key}: [{string.Join(", ", group.Value)}]");
}
// Calculate statistics
double sum = numbers.Sum();
double average = numbers.Average();
int count = numbers.Count();
Console.WriteLine($"\nStatistics:");
Console.WriteLine($"Count: {count}");
Console.WriteLine($"Sum: {sum}");
Console.WriteLine($"Average: {average:F2}");
}
// 8. Array performance considerations
public static void ArrayPerformance()
{
Console.WriteLine("\n=== Array Performance Considerations ===");
const int size = 1000000;
int[] largeArray = new int[size];
// Initialize with random numbers
Random random = new Random();
for (int i = 0; i < size; i++)
{
largeArray[i] = random.Next(1000);
}
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// Measure sorting performance
stopwatch.Restart();
Array.Sort(largeArray);
stopwatch.Stop();
Console.WriteLine($"Sorting {size:N0} elements took {stopwatch.ElapsedMilliseconds}ms");
// Measure binary search performance
stopwatch.Restart();
int foundIndex = Array.BinarySearch(largeArray, 500);
stopwatch.Stop();
Console.WriteLine($"Binary search took {stopwatch.ElapsedTicks} ticks");
// Measure LINQ performance
stopwatch.Restart();
var filtered = largeArray.Where(n => n > 500).Take(10).ToArray();
stopwatch.Stop();
Console.WriteLine($"LINQ filtering took {stopwatch.ElapsedMilliseconds}ms");
}
// 9. Working with strings as arrays
public static void StringArrays()
{
Console.WriteLine("\n=== String Arrays ===");
// String array operations
string[] words = { "apple", "banana", "cherry", "date", "elderberry" };
Console.WriteLine("String array:");
PrintArray(words);
// Sort strings
Array.Sort(words);
Console.WriteLine("\nSorted strings:");
PrintArray(words);
// Find strings starting with specific letter
var startsWithB = words.Where(w => w.StartsWith("b", StringComparison.OrdinalIgnoreCase)).ToArray();
Console.WriteLine($"\nWords starting with 'B': [{string.Join(", ", startsWithB)}]");
// String length analysis
var lengthAnalysis = words.ToDictionary(w => w, w => w.Length);
Console.WriteLine("\nLength analysis:");
foreach (var kvp in lengthAnalysis)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} characters");
}
}
// 10. Custom array helper methods
public static void CustomArrayHelpers()
{
Console.WriteLine("\n=== Custom Array Helpers ===");
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Console.WriteLine("Original array:");
PrintArray(numbers);
// Custom bubble sort
int[] bubbleSorted = (int[])numbers.Clone();
BubbleSort(bubbleSorted);
Console.WriteLine("\nBubble sorted:");
PrintArray(bubbleSorted);
// Custom reverse
int[] reversed = (int[])numbers.Clone();
ReverseArray(reversed);
Console.WriteLine("\nReversed:");
PrintArray(reversed);
// Find subarray
int[] subArray = FindSubArray(numbers, 3, 6);
Console.WriteLine("\nSubarray (elements 3-5):");
PrintArray(subArray);
// Rotate array
int[] rotated = RotateArray(numbers, 3);
Console.WriteLine("\nRotated (left by 3):");
PrintArray(rotated);
}
// Helper methods
static void PrintArray<T>(T[] array)
{
Console.WriteLine($"[{string.Join(", ", array)}]");
}
static void PrintJaggedArray<T>(T[][] jaggedArray)
{
for (int i = 0; i < jaggedArray.Length; i++)
{
Console.Write($"Row {i}: [");
for (int j = 0; j < jaggedArray[i].Length; j++)
{
Console.Write(jaggedArray[i][j]);
if (j < jaggedArray[i].Length - 1) Console.Write(", ");
}
Console.WriteLine("]");
}
}
static void BubbleSort<T>(T[] array) where T : IComparable<T>
{
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = 0; j < array.Length - i - 1; j++)
{
if (array[j].CompareTo(array[j + 1]) > 0)
{
T temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
static void ReverseArray<T>(T[] array)
{
for (int i = 0; i < array.Length / 2; i++)
{
T temp = array[i];
array[i] = array[array.Length - 1 - i];
array[array.Length - 1 - i] = temp;
}
}
static T[] FindSubArray<T>(T[] array, int start, int end)
{
if (start < 0 || end >= array.Length || start > end)
{
return new T[0];
}
int length = end - start + 1;
T[] subArray = new T[length];
Array.Copy(array, start, subArray, 0, length);
return subArray;
}
static T[] RotateArray<T>(T[] array, int positions)
{
if (array == null || array.Length == 0)
return array;
positions = positions % array.Length;
if (positions < 0)
positions += array.Length;
T[] rotated = new T[array.Length];
for (int i = 0; i < array.Length; i++)
{
rotated[i] = array[(i + positions) % array.Length];
}
return rotated;
}
static void Main(string[] args)
{
Console.WriteLine("=== C# Array Operations Demo ===\n");
try
{
ArrayBasics();
MultiDimensionalArrays();
JaggedArrays();
ArrayManipulation();
ArraySearching();
AdvancedArrayOperations();
ArrayTransformation();
ArrayPerformance();
StringArrays();
CustomArrayHelpers();
Console.WriteLine("\nAll array operation examples completed successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in array demo: {ex.Message}");
}
}
}Opérations Hashtable et Dictionary
Opérations Dictionary, Hashtable et paires clé-valeur avec différents types de données et cas d'usage
Difficulté
4/10
Temps estimé
25 min
Étiquettes
csharp, dictionary, hashtable, data structures, windows
Prérequis
Basic C# collections, Generic types
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class HashtableOperations
{
// 1. Dictionary operations
public static void DictionaryBasics()
{
Console.WriteLine("=== Dictionary Basics ===");
// Create dictionary with string keys and int values
Dictionary<string, int> studentGrades = new Dictionary<string, int>
{
{ "Alice", 85 },
{ "Bob", 92 },
{ "Charlie", 78 }
};
Console.WriteLine("Initial dictionary:");
PrintDictionary(studentGrades);
// Add new items
studentGrades.Add("David", 90);
studentGrades["Eve"] = 88; // Alternative way to add
Console.WriteLine("\nAfter adding new students:");
PrintDictionary(studentGrades);
// Access values
Console.WriteLine($"\nAlice's grade: {studentGrades["Alice"]}");
// TryGetValue (safe access)
if (studentGrades.TryGetValue("Frank", out int franksGrade))
{
Console.WriteLine($"Frank's grade: {franksGrade}");
}
else
{
Console.WriteLine("Frank is not in the dictionary");
}
// Update value
studentGrades["Alice"] = 87;
Console.WriteLine($"\nAlice's updated grade: {studentGrades["Alice"]}");
}
// 2. Dictionary with different data types
public static void DictionaryWithDifferentTypes()
{
Console.WriteLine("\n=== Dictionary with Different Types ===");
// Dictionary with int keys and string values
Dictionary<int, string> months = new Dictionary<int, string>
{
{ 1, "January" },
{ 2, "February" },
{ 3, "March" },
{ 4, "April" },
{ 5, "May" },
{ 6, "June" }
};
Console.WriteLine("Months dictionary:");
foreach (var month in months)
{
Console.WriteLine($"{month.Key}: {month.Value}");
}
// Dictionary with custom object keys
Dictionary<Person, string> employeeRoles = new Dictionary<Person, string>
{
{ new Person { Id = 1, Name = "John Doe" }, "Developer" },
{ new Person { Id = 2, Name = "Jane Smith" }, "Designer" }
};
Console.WriteLine("\nEmployee roles:");
foreach (var employee in employeeRoles)
{
Console.WriteLine($"{employee.Key.Name}: {employee.Value}");
}
}
// 3. Hashtable operations (non-generic)
public static void HashtableBasics()
{
Console.WriteLine("\n=== Hashtable Basics ===");
Hashtable inventory = new Hashtable();
// Add items
inventory.Add("Laptop", 15);
inventory.Add("Mouse", 50);
inventory.Add("Keyboard", 30);
// Alternative ways to add
inventory["Monitor"] = 20;
inventory["Printer"] = 10;
Console.WriteLine("Inventory hashtable:");
foreach (DictionaryEntry item in inventory)
{
Console.WriteLine($"{item.Key}: {item.Value}");
}
// Access values
Console.WriteLine($"\nNumber of laptops: {inventory["Laptop"]}");
// Check if key exists
Console.WriteLine($"Contains 'Mouse': {inventory.ContainsKey("Mouse")}");
Console.WriteLine($"Contains 'Tablet': {inventory.ContainsKey("Tablet")}");
// Remove item
inventory.Remove("Printer");
Console.WriteLine("\nAfter removing Printer:");
foreach (DictionaryEntry item in inventory)
{
Console.WriteLine($"{item.Key}: {item.Value}");
}
}
// 4. Dictionary operations and methods
public static void DictionaryOperations()
{
Console.WriteLine("\n=== Dictionary Operations ===");
Dictionary<string, List<string>> wordGroups = new Dictionary<string, List<string>>
{
{ "Fruits", new List<string> { "Apple", "Banana", "Orange" } },
{ "Colors", new List<string> { "Red", "Green", "Blue" } },
{ "Animals", new List<string> { "Dog", "Cat", "Bird" } }
};
Console.WriteLine("Word groups:");
PrintNestedDictionary(wordGroups);
// Add to existing list
wordGroups["Fruits"].Add("Grape");
wordGroups["Colors"].Add("Yellow");
// Add new category
wordGroups["Vehicles"] = new List<string> { "Car", "Bike", "Bus" };
Console.WriteLine("\nUpdated word groups:");
PrintNestedDictionary(wordGroups);
// Remove specific item from list
wordGroups["Colors"].Remove("Red");
Console.WriteLine("\nAfter removing 'Red' from Colors:");
// Dictionary methods
Console.WriteLine($"Total categories: {wordGroups.Count}");
Console.WriteLine($"Contains 'Animals': {wordGroups.ContainsKey("Animals")}");
Console.WriteLine($"Contains 'Vegetables': {wordGroups.ContainsKey("Vegetables")}");
// Get keys and values
Console.WriteLine("\nAll categories:");
foreach (string key in wordGroups.Keys)
{
Console.WriteLine(key);
}
}
// 5. Dictionary searching and filtering
public static void DictionarySearching()
{
Console.WriteLine("\n=== Dictionary Searching ===");
Dictionary<string, double> productPrices = new Dictionary<string, double>
{
{ "Laptop", 999.99 },
{ "Mouse", 25.50 },
{ "Keyboard", 75.00 },
{ "Monitor", 299.99 },
{ "Headphones", 149.99 },
{ "USB Cable", 12.99 },
{ "Webcam", 89.99 }
};
Console.WriteLine("Product prices:");
PrintDictionary(productPrices);
// Find expensive products (price > 100)
var expensiveProducts = productPrices.Where(kvp => kvp.Value > 100)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Console.WriteLine("\nExpensive products (> $100):");
PrintDictionary(expensiveProducts);
// Find products with specific names
var productsStartingWithM = productPrices.Where(kvp => kvp.Key.StartsWith("M"))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Console.WriteLine("\nProducts starting with 'M':");
PrintDictionary(productsStartingWithM);
// Calculate total value
double totalValue = productPrices.Values.Sum();
Console.WriteLine($"\nTotal inventory value: ${totalValue:F2}");
// Average price
double averagePrice = productPrices.Values.Average();
Console.WriteLine($"Average price: ${averagePrice:F2}");
// Find cheapest and most expensive
var cheapest = productPrices.OrderBy(kvp => kvp.Value).First();
var mostExpensive = productPrices.OrderByDescending(kvp => kvp.Value).First();
Console.WriteLine($"Cheapest: {cheapest.Key} (${cheapest.Value:F2})");
Console.WriteLine($"Most expensive: {mostExpensive.Key} (${mostExpensive.Value:F2})");
}
// 6. Dictionary with custom comparers
public static void CustomDictionaryComparers()
{
Console.WriteLine("\n=== Custom Dictionary Comparers ===");
// Case-insensitive string key dictionary
Dictionary<string, int> caseInsensitiveDict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
caseInsensitiveDict.Add("Apple", 1);
caseInsensitiveDict.Add("Banana", 2);
Console.WriteLine("Case-insensitive dictionary:");
PrintDictionary(caseInsensitiveDict);
// These operations work regardless of case
Console.WriteLine($"Contains 'apple': {caseInsensitiveDict.ContainsKey("apple")}");
Console.WriteLine($"Contains 'APPLE': {caseInsensitiveDict.ContainsKey("APPLE")}");
caseInsensitiveDict["APPLE"] = 3; // Updates the existing "Apple"
Console.WriteLine($"After update, 'Apple' value: {caseInsensitiveDict["Apple"]}");
// Sorted dictionary
SortedDictionary<string, int> sortedDict = new SortedDictionary<string, int>
{
{ "Zebra", 1 },
{ "Apple", 2 },
{ "Banana", 3 },
{ "Cherry", 4 }
};
Console.WriteLine("\nSorted dictionary (automatic alphabetical order):");
PrintDictionary(sortedDict);
}
// 7. Concurrent dictionary for multi-threading
public static void ConcurrentDictionaryDemo()
{
Console.WriteLine("\n=== Concurrent Dictionary ===");
var concurrentDict = new System.Collections.Concurrent.ConcurrentDictionary<string, int>();
// Try add operations
bool added1 = concurrentDict.TryAdd("Thread1", 1);
bool added2 = concurrentDict.TryAdd("Thread1", 2); // Won't add since key exists
bool added3 = concurrentDict.TryAdd("Thread2", 2);
Console.WriteLine($"Added Thread1 first time: {added1}");
Console.WriteLine($"Added Thread1 second time: {added2}");
Console.WriteLine($"Added Thread2: {added3}");
// Try update
bool updated = concurrentDict.TryUpdate("Thread1", 3, 1);
Console.WriteLine($"Updated Thread1 from 1 to 3: {updated}");
// Get or add
int value = concurrentDict.GetOrAdd("Thread3", 3);
Console.WriteLine($"GetOrAdd Thread3: {value}");
// Add or update
concurrentDict.AddOrUpdate("Thread2", 5, (key, existingValue) => existingValue * 2);
Console.WriteLine("\nConcurrent dictionary contents:");
PrintConcurrentDictionary(concurrentDict);
}
// 8. Dictionary performance considerations
public static void DictionaryPerformance()
{
Console.WriteLine("\n=== Dictionary Performance ===");
const int itemCount = 100000;
var dictionary = new Dictionary<int, string>();
var hashtable = new Hashtable();
var random = new Random();
// Populate collections
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// Dictionary population
stopwatch.Restart();
for (int i = 0; i < itemCount; i++)
{
dictionary[i] = $"Item_{i}";
}
stopwatch.Stop();
Console.WriteLine($"Dictionary population ({itemCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
// Hashtable population
stopwatch.Restart();
for (int i = 0; i < itemCount; i++)
{
hashtable[i] = $"Item_{i}";
}
stopwatch.Stop();
Console.WriteLine($"Hashtable population ({itemCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
// Search performance
int[] searchKeys = Enumerable.Range(0, 1000).Select(_ => random.Next(itemCount)).ToArray();
stopwatch.Restart();
foreach (int key in searchKeys)
{
dictionary.TryGetValue(key, out _);
}
stopwatch.Stop();
Console.WriteLine($"Dictionary searches (1000 lookups): {stopwatch.ElapsedTicks} ticks");
stopwatch.Restart();
foreach (int key in searchKeys)
{
hashtable.ContainsKey(key);
}
stopwatch.Stop();
Console.WriteLine($"Hashtable searches (1000 lookups): {stopwatch.ElapsedTicks} ticks");
}
// 9. Dictionary serialization and persistence
public static void DictionaryPersistence()
{
Console.WriteLine("\n=== Dictionary Persistence ===");
Dictionary<string, object> settings = new Dictionary<string, object>
{
{ "AppName", "MyApplication" },
{ "Version", "1.0.0" },
{ "MaxUsers", 100 },
{ "EnableLogging", true },
{ "ApiKey", "abc123xyz" }
};
Console.WriteLine("Application settings:");
PrintDictionary(settings);
// Serialize to JSON (simplified)
string json = System.Text.Json.JsonSerializer.Serialize(settings, new System.Text.Json.JsonSerializerOptions { WriteIndented = true });
Console.WriteLine("\nJSON representation:");
Console.WriteLine(json);
// Save to file
string filePath = "settings.json";
System.IO.File.WriteAllText(filePath, json);
Console.WriteLine($"
Settings saved to {filePath}");
// Load from file
if (System.IO.File.Exists(filePath))
{
string loadedJson = System.IO.File.ReadAllText(filePath);
var loadedSettings = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(loadedJson);
Console.WriteLine("
Loaded settings:");
if (loadedSettings != null)
{
PrintDictionary(loadedSettings.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));
}
// Cleanup
System.IO.File.Delete(filePath);
}
}
// 10. Advanced dictionary patterns
public static void AdvancedDictionaryPatterns()
{
Console.WriteLine("\n=== Advanced Dictionary Patterns ===");
// Lookup dictionary (for multiple values per key)
Dictionary<string, List<int>> multiValues = new Dictionary<string, List<int>>
{
{ "Even", new List<int>() },
{ "Odd", new List<int>() }
};
// Group numbers by parity
for (int i = 1; i <= 10; i++)
{
string key = i % 2 == 0 ? "Even" : "Odd";
multiValues[key].Add(i);
}
Console.WriteLine("Numbers grouped by parity:");
foreach (var group in multiValues)
{
Console.WriteLine($"{group.Key}: [{string.Join(", ", group.Value)}]");
}
// Nested dictionary
Dictionary<string, Dictionary<string, int>> nestedDict = new Dictionary<string, Dictionary<string, int>>
{
{ "Products", new Dictionary<string, int>
{
{ "Electronics", 150 },
{ "Clothing", 80 },
{ "Books", 200 }
}
},
{ "Services", new Dictionary<string, int>
{
{ "Consulting", 50 },
{ "Support", 120 },
{ "Training", 30 }
}
}
};
Console.WriteLine("\nNested dictionary:");
foreach (var category in nestedDict)
{
Console.WriteLine($"{category.Key}:");
foreach (var item in category.Value)
{
Console.WriteLine($" {item.Item1}: {item.Item2}");
}
}
// Default dictionary pattern
Dictionary<string, int> wordCounts = new Dictionary<string, int>();
string text = "the quick brown fox jumps over the lazy dog the quick brown fox";
string[] words = text.Split();
foreach (string word in words)
{
if (wordCounts.ContainsKey(word))
{
wordCounts[word]++;
}
else
{
wordCounts[word] = 1;
}
}
Console.WriteLine("\nWord frequency count:");
foreach (var wordCount in wordCounts.OrderByDescending(kvp => kvp.Value))
{
Console.WriteLine($"{wordCount.Key}: {wordCount.Value}");
}
}
// Helper classes
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is Person other)
{
return Id == other.Id && Name == other.Name;
}
return false;
}
public override int GetHashCode()
{
return HashCode.Combine(Id, Name);
}
}
// Helper methods
static void PrintDictionary<T, U>(Dictionary<T, U> dict)
{
foreach (var kvp in dict)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
}
static void PrintDictionary(Dictionary<string, object> dict)
{
foreach (var kvp in dict)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} ({kvp.Value.GetType().Name})");
}
}
static void PrintNestedDictionary(Dictionary<string, List<string>> dict)
{
foreach (var kvp in dict)
{
Console.WriteLine($"{kvp.Key}: [{string.Join(", ", kvp.Value)}]");
}
}
static void PrintConcurrentDictionary(System.Collections.Concurrent.ConcurrentDictionary<string, int> dict)
{
foreach (var kvp in dict)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
}
static void Main(string[] args)
{
Console.WriteLine("=== C# Hashtable and Dictionary Demo ===\n");
try
{
DictionaryBasics();
DictionaryWithDifferentTypes();
HashtableBasics();
DictionaryOperations();
DictionarySearching();
CustomDictionaryComparers();
ConcurrentDictionaryDemo();
DictionaryPerformance();
DictionaryPersistence();
AdvancedDictionaryPatterns();
Console.WriteLine("\nAll hashtable and dictionary examples completed successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in hashtable demo: {ex.Message}");
}
}
}Opérations de Liste Chaînée
Implémentation de listes chaînées simples et doubles, opérations et patterns d'usage en C#
Difficulté
6/10
Temps estimé
30 min
Étiquettes
csharp, linked list, data structures, custom implementations, windows
Prérequis
C# classes, Generics, Reference types
using System;
using System.Collections.Generic;
class LinkedListOperations
{
// 1. Singly linked list implementation
public class SinglyLinkedList<T>
{
private class Node
{
public T Data { get; set; }
public Node Next { get; set; }
public Node(T data)
{
Data = data;
Next = null;
}
}
private Node head;
private int count;
public int Count => count;
public bool IsEmpty => head == null;
public void AddFirst(T data)
{
Node newNode = new Node(data);
newNode.Next = head;
head = newNode;
count++;
}
public void AddLast(T data)
{
Node newNode = new Node(data);
if (head == null)
{
head = newNode;
}
else
{
Node current = head;
while (current.Next != null)
{
current = current.Next;
}
current.Next = newNode;
}
count++;
}
public bool Remove(T data)
{
if (head == null) return false;
if (head.Data.Equals(data))
{
head = head.Next;
count--;
return true;
}
Node current = head;
while (current.Next != null)
{
if (current.Next.Data.Equals(data))
{
current.Next = current.Next.Next;
count--;
return true;
}
current = current.Next;
}
return false;
}
public bool Contains(T data)
{
Node current = head;
while (current != null)
{
if (current.Data.Equals(data))
return true;
current = current.Next;
}
return false;
}
public void Clear()
{
head = null;
count = 0;
}
public void Print()
{
Node current = head;
Console.Write("Head -> ");
while (current != null)
{
Console.Write($"{current.Data} -> ");
current = current.Next;
}
Console.WriteLine("Null");
}
public IEnumerator<T> GetEnumerator()
{
Node current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}
// 2. Doubly linked list implementation
public class DoublyLinkedList<T>
{
private class Node
{
public T Data { get; set; }
public Node Previous { get; set; }
public Node Next { get; set; }
public Node(T data)
{
Data = data;
Previous = null;
Next = null;
}
}
private Node head;
private Node tail;
private int count;
public int Count => count;
public bool IsEmpty => head == null;
public void AddFirst(T data)
{
Node newNode = new Node(data);
if (head == null)
{
head = tail = newNode;
}
else
{
newNode.Next = head;
head.Previous = newNode;
head = newNode;
}
count++;
}
public void AddLast(T data)
{
Node newNode = new Node(data);
if (tail == null)
{
head = tail = newNode;
}
else
{
tail.Next = newNode;
newNode.Previous = tail;
tail = newNode;
}
count++;
}
public bool Remove(T data)
{
Node current = head;
while (current != null)
{
if (current.Data.Equals(data))
{
if (current.Previous != null)
current.Previous.Next = current.Next;
else
head = current.Next;
if (current.Next != null)
current.Next.Previous = current.Previous;
else
tail = current.Previous;
count--;
return true;
}
current = current.Next;
}
return false;
}
public void PrintForward()
{
Node current = head;
Console.Write("Head -> ");
while (current != null)
{
Console.Write($"{current.Data} <-> ");
current = current.Next;
}
Console.WriteLine("Null");
}
public void PrintBackward()
{
Node current = tail;
Console.Write("Tail -> ");
while (current != null)
{
Console.Write($"{current.Data} <-> ");
current = current.Previous;
}
Console.WriteLine("Null");
}
}
// 3. Singly linked list operations
public static void SinglyLinkedListOperations()
{
Console.WriteLine("=== Singly Linked List Operations ===");
SinglyLinkedList<int> list = new SinglyLinkedList<int>();
Console.WriteLine("Adding elements to linked list:");
list.AddFirst(10);
Console.WriteLine("Added 10 to front:");
list.Print();
list.AddLast(20);
Console.WriteLine("Added 20 to back:");
list.Print();
list.AddFirst(5);
Console.WriteLine("Added 5 to front:");
list.Print();
list.AddLast(30);
Console.WriteLine("Added 30 to back:");
list.Print();
Console.WriteLine($"\nList count: {list.Count}");
Console.WriteLine($"List is empty: {list.IsEmpty}");
Console.WriteLine("\nSearching for elements:");
Console.WriteLine($"Contains 20: {list.Contains(20)}");
Console.WriteLine($"Contains 99: {list.Contains(99)}");
Console.WriteLine("\nRemoving elements:");
bool removed = list.Remove(20);
Console.WriteLine($"Removed 20: {removed}");
list.Print();
removed = list.Remove(99);
Console.WriteLine($"Removed 99: {removed}");
list.Print();
// Iterate through the list
Console.WriteLine("\nIterating through the list:");
foreach (int item in list)
{
Console.WriteLine($"Item: {item}");
}
}
// 4. Doubly linked list operations
public static void DoublyLinkedListOperations()
{
Console.WriteLine("\n=== Doubly Linked List Operations ===");
DoublyLinkedList<string> list = new DoublyLinkedList<string>();
Console.WriteLine("Adding elements to doubly linked list:");
list.AddFirst("B");
Console.WriteLine("Added 'B' to front:");
list.PrintForward();
list.AddLast("C");
Console.WriteLine("Added 'C' to back:");
list.PrintForward();
list.AddFirst("A");
Console.WriteLine("Added 'A' to front:");
list.PrintForward();
list.AddLast("D");
Console.WriteLine("Added 'D' to back:");
list.PrintForward();
Console.WriteLine("\nForward traversal:");
list.PrintForward();
Console.WriteLine("\nBackward traversal:");
list.PrintBackward();
Console.WriteLine($"\nList count: {list.Count}");
Console.WriteLine("\nRemoving 'B':");
list.Remove("B");
list.PrintForward();
Console.WriteLine("\nBackward traversal after removal:");
list.PrintBackward();
}
// 5. Built-in LinkedList<T> operations
public static void BuiltInLinkedListOperations()
{
Console.WriteLine("\n=== Built-in LinkedList<T> Operations ===");
LinkedList<string> list = new LinkedList<string>();
Console.WriteLine("Adding elements to built-in LinkedList:");
list.AddFirst("Second");
Console.WriteLine("Added 'Second' to first position:");
list.AddFirst("First");
Console.WriteLine("Added 'First' to first position:");
list.AddLast("Third");
Console.WriteLine("Added 'Third' to last position:");
list.AddLast("Fourth");
Console.WriteLine("Added 'Fourth' to last position:");
Console.WriteLine("\nLinkedList contents:");
foreach (string item in list)
{
Console.WriteLine(item);
}
// Get references to nodes
LinkedListNode<string> firstNode = list.First;
LinkedListNode<string> lastNode = list.Last;
Console.WriteLine($"\nFirst node: {firstNode?.Value}");
Console.WriteLine($"Last node: {lastNode?.Value}");
// Insert after and before specific nodes
LinkedListNode<string> secondNode = firstNode.Next;
list.AddAfter(secondNode, "Second and a Half");
Console.WriteLine("\nAfter adding 'Second and a Half' after 'Second':");
foreach (string item in list)
{
Console.WriteLine(item);
}
list.AddBefore(lastNode, "Third and a Half");
Console.WriteLine("\nAfter adding 'Third and a Half' before 'Fourth':");
foreach (string item in list)
{
Console.WriteLine(item);
}
// Remove specific values
list.Remove("Second and a Half");
Console.WriteLine("\nAfter removing 'Second and a Half':");
foreach (string item in list)
{
Console.WriteLine(item);
}
// Remove first and last
list.RemoveFirst();
list.RemoveLast();
Console.WriteLine("\nAfter removing first and last:");
foreach (string item in list)
{
Console.WriteLine(item);
}
Console.WriteLine($"\nLinkedList count: {list.Count}");
}
// 6. LinkedList performance comparison
public static void LinkedListPerformanceComparison()
{
Console.WriteLine("\n=== LinkedList Performance Comparison ===");
const int itemCount = 10000;
var random = new Random();
// Test built-in LinkedList
var linkedList = new LinkedList<int>();
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// Adding elements
stopwatch.Restart();
for (int i = 0; i < itemCount; i++)
{
linkedList.AddLast(i);
}
stopwatch.Stop();
Console.WriteLine($"LinkedList.AddLast ({itemCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
// Test List<T>
var list = new List<int>();
stopwatch.Restart();
for (int i = 0; i < itemCount; i++)
{
list.Add(i);
}
stopwatch.Stop();
Console.WriteLine($"List.Add ({itemCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
// Test insertion at beginning
int insertCount = 1000;
stopwatch.Restart();
for (int i = 0; i < insertCount; i++)
{
linkedList.AddFirst(i);
}
stopwatch.Stop();
Console.WriteLine($"LinkedList.AddFirst ({insertCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
stopwatch.Restart();
for (int i = 0; i < insertCount; i++)
{
list.Insert(0, i);
}
stopwatch.Stop();
Console.WriteLine($"List.Insert(0) ({insertCount:N0} items): {stopwatch.ElapsedMilliseconds}ms");
}
// 7. LinkedList use cases
public static void LinkedListUseCases()
{
Console.WriteLine("\n=== LinkedList Use Cases ===");
// Use case 1: Undo/Redo functionality
Console.WriteLine("Use Case 1: Undo/Redo System");
UndoRedoSystem undoRedo = new UndoRedoSystem();
undoRedo.PerformAction("Type text");
undoRedo.PerformAction("Delete character");
undoRedo.PerformAction("Format text");
Console.WriteLine($"Current action: {undoRedo.GetCurrentAction()}");
Console.WriteLine($"Undo: {undoRedo.Undo()}");
Console.WriteLine($"Current action: {undoRedo.GetCurrentAction()}");
Console.WriteLine($"Redo: {undoRedo.Redo()}");
Console.WriteLine($"Current action: {undoRedo.GetCurrentAction()}");
// Use case 2: Music playlist
Console.WriteLine("\nUse Case 2: Music Playlist");
MusicPlaylist playlist = new MusicPlaylist();
playlist.AddSong("Song 1 - Artist A");
playlist.AddSong("Song 2 - Artist B");
playlist.AddSong("Song 3 - Artist C");
Console.WriteLine("Current playlist:");
playlist.PrintPlaylist();
Console.WriteLine($"\nPlaying: {playlist.PlayNext()}");
Console.WriteLine($"Playing: {playlist.PlayNext()}");
Console.WriteLine($"Playing: {playlist.PlayNext()}");
Console.WriteLine($"Playing: {playlist.PlayNext()}"); // Should wrap around
// Use case 3: Browser history
Console.WriteLine("\nUse Case 3: Browser History");
BrowserHistory history = new BrowserHistory();
history.VisitPage("https://google.com");
history.VisitPage("https://stackoverflow.com");
history.VisitPage("https://github.com");
Console.WriteLine("Current page: " + history.GetCurrentPage());
Console.WriteLine("Go back: " + history.GoBack());
Console.WriteLine("Go back: " + history.GoBack());
Console.WriteLine("Go forward: " + history.GoForward());
}
// Helper classes for use cases
public class UndoRedoSystem
{
private LinkedList<string> actions = new LinkedList<string>();
private LinkedListNode<string> currentAction;
public void PerformAction(string action)
{
// Remove all actions after current position
while (currentAction?.Next != null)
{
actions.RemoveLast();
}
actions.AddLast(action);
currentAction = actions.Last;
}
public string Undo()
{
if (currentAction?.Previous != null)
{
currentAction = currentAction.Previous;
return currentAction.Value;
}
return "Nothing to undo";
}
public string Redo()
{
if (currentAction?.Next != null)
{
currentAction = currentAction.Next;
return currentAction.Value;
}
return "Nothing to redo";
}
public string GetCurrentAction()
{
return currentAction?.Value ?? "No actions";
}
}
public class MusicPlaylist
{
private LinkedList<string> songs = new LinkedList<string>();
private LinkedListNode<string> currentSong;
public void AddSong(string song)
{
if (songs.Count == 0)
{
songs.AddFirst(song);
currentSong = songs.First;
}
else
{
songs.AddLast(song);
}
}
public string PlayNext()
{
if (currentSong?.Next != null)
{
currentSong = currentSong.Next;
}
else
{
currentSong = songs.First; // Wrap around
}
return currentSong?.Value ?? "No songs";
}
public string PlayPrevious()
{
if (currentSong?.Previous != null)
{
currentSong = currentSong.Previous;
}
else
{
currentSong = songs.Last; // Wrap around
}
return currentSong?.Value ?? "No songs";
}
public void PrintPlaylist()
{
foreach (string song in songs)
{
string marker = song == currentSong?.Value ? " (Current)" : "";
Console.WriteLine(song + marker);
}
}
}
public class BrowserHistory
{
private LinkedList<string> pages = new LinkedList<string>();
private LinkedListNode<string> currentPage;
public void VisitPage(string url)
{
if (currentPage?.Next != null)
{
// Clear forward history
var node = currentPage.Next;
while (node != null)
{
var next = node.Next;
pages.Remove(node);
node = next;
}
}
pages.AddLast(url);
currentPage = pages.Last;
}
public string GoBack()
{
if (currentPage?.Previous != null)
{
currentPage = currentPage.Previous;
return currentPage.Value;
}
return "No previous page";
}
public string GoForward()
{
if (currentPage?.Next != null)
{
currentPage = currentPage.Next;
return currentPage.Value;
}
return "No next page";
}
public string GetCurrentPage()
{
return currentPage?.Value ?? "No pages";
}
}
// 8. Circular linked list
public class CircularLinkedList<T>
{
private class Node
{
public T Data { get; set; }
public Node Next { get; set; }
public Node(T data)
{
Data = data;
Next = null;
}
}
private Node head;
private int count;
public int Count => count;
public bool IsEmpty => head == null;
public void Add(T data)
{
Node newNode = new Node(data);
if (head == null)
{
head = newNode;
head.Next = head; // Points to itself
}
else
{
Node current = head;
while (current.Next != head)
{
current = current.Next;
}
current.Next = newNode;
newNode.Next = head;
}
count++;
}
public void Print()
{
if (head == null)
{
Console.WriteLine("Empty circular list");
return;
}
Node current = head;
Console.Write("Head -> ");
do
{
Console.Write($"{current.Data} -> ");
current = current.Next;
} while (current != head);
Console.WriteLine("(back to Head)");
}
public void Rotate(int positions)
{
if (head == null || count <= 1) return;
for (int i = 0; i < Math.Abs(positions) % count; i++)
{
if (positions > 0)
{
head = head.Next;
}
else
{
// Find previous node
Node current = head;
while (current.Next != head)
{
current = current.Next;
}
head = current;
}
}
}
}
public static void CircularLinkedListDemo()
{
Console.WriteLine("\n=== Circular Linked List Demo ===");
CircularLinkedList<char> circle = new CircularLinkedList<char>();
circle.Add('A');
circle.Add('B');
circle.Add('C');
circle.Add('D');
Console.WriteLine("Initial circular list:");
circle.Print();
Console.WriteLine("\nRotate right by 1 position:");
circle.Rotate(1);
circle.Print();
Console.WriteLine("\nRotate right by 2 positions:");
circle.Rotate(2);
circle.Print();
Console.WriteLine("\nRotate left by 1 position:");
circle.Rotate(-1);
circle.Print();
}
static void Main(string[] args)
{
Console.WriteLine("=== C# Linked List Operations Demo ===\n");
try
{
SinglyLinkedListOperations();
DoublyLinkedListOperations();
BuiltInLinkedListOperations();
LinkedListPerformanceComparison();
LinkedListUseCases();
CircularLinkedListDemo();
Console.WriteLine("\nAll linked list examples completed successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in linked list demo: {ex.Message}");
}
}
}Outils
Outils souvent utilisés avec cet exemple
Associé