From 34ccda4b9377a9e8303f915f14ca32b8516de3f7 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Thu, 18 Apr 2019 08:25:53 -0500 Subject: [PATCH 1/4] add samples for indexes and ranges (#823) Contributes to dotnet/docs#3966 --- .../RangesIndexes/IndicesAndRanges.cs | 152 ++++++++++++++++++ csharp/tutorials/RangesIndexes/Program.cs | 27 ++++ .../RangesIndexes/RangesIndexes.csproj | 8 + 3 files changed, 187 insertions(+) create mode 100644 csharp/tutorials/RangesIndexes/IndicesAndRanges.cs create mode 100644 csharp/tutorials/RangesIndexes/Program.cs create mode 100644 csharp/tutorials/RangesIndexes/RangesIndexes.csproj diff --git a/csharp/tutorials/RangesIndexes/IndicesAndRanges.cs b/csharp/tutorials/RangesIndexes/IndicesAndRanges.cs new file mode 100644 index 00000000000..41422d487c3 --- /dev/null +++ b/csharp/tutorials/RangesIndexes/IndicesAndRanges.cs @@ -0,0 +1,152 @@ +using System; +using System.Linq; + +namespace RangesIndexes +{ + class IndicesAndRanges + { + // + private string[] words = new string[] + { + // index from start index from end + "The", // 0 ^9 + "quick", // 1 ^8 + "brown", // 2 ^7 + "fox", // 3 ^6 + "jumped", // 4 ^5 + "over", // 5 ^4 + "the", // 6 ^3 + "lazy", // 7 ^2 + "dog" // 8 ^1 + }; + // + + internal int Syntax_LastIndex() + { + // + Console.WriteLine($"The last word is {words[^1]}"); + // + return 0; + } + + internal int Syntax_Range() + { + // + var quickBrownFox = words[1..4]; + foreach (var word in quickBrownFox) + Console.Write($"< {word} >"); + Console.WriteLine(); + // + return 0; + } + + internal int Syntax_LastRange() + { + // + var lazyDog = words[^2..^0]; + foreach (var word in lazyDog) + Console.Write($"< {word} >"); + Console.WriteLine(); + // + return 0; + } + + internal int Syntax_PartialRange() + { + // + var allWords = words[..]; // contains "The" through "dog". + var firstPhrase = words[..4]; // contains "The" through "fox" + var lastPhrase = words[6..]; // contains "the, "lazy" and "dog" + foreach (var word in allWords) + Console.Write($"< {word} >"); + Console.WriteLine(); + foreach (var word in firstPhrase) + Console.Write($"< {word} >"); + Console.WriteLine(); + foreach (var word in lastPhrase) + Console.Write($"< {word} >"); + Console.WriteLine(); + // + return 0; + } + + internal int Syntax_IndexRangeType() + { + // + Index the = ^3; + Console.WriteLine(words[the]); + Range phrase = 1..4; + var text = words[phrase]; + foreach (var word in text) + Console.Write($"< {word} >"); + Console.WriteLine(); + // + return 0; + } + + internal int Syntax_WhyChosenSemantics() + { + // + var numbers = Enumerable.Range(0, 100).ToArray(); + int x = 12; + int y = 25; + int z = 36; + + Console.WriteLine($"{numbers[^x]} is the same as {numbers[numbers.Length - x]}"); + Console.WriteLine($"{numbers[x..y].Length} is the same as {y - x}"); + + Console.WriteLine("numbers[x..y] and numbers[y..z] are consecutive and disjoint:"); + Span x_y = numbers[x..y]; + Span y_z = numbers[y..z]; + Console.WriteLine($"\tnumbers[x..y] is {x_y[0]} through {x_y[^1]}, numbers[y..z] is {y_z[0]} through {y_z[^1]}"); + + Console.WriteLine("numbers[x..^x] removes x elements at each end:"); + Span x_x = numbers[x..^x]; + Console.WriteLine($"\tnumbers[x..^x] starts with {x_x[0]} and ends with {x_x[^1]}"); + + Console.WriteLine("numbers[..x] means numbers[0..x] and numbers[x..] means numbers[x..^0]"); + Span start_x = numbers[..x]; + Span zero_x = numbers[0..x]; + Console.WriteLine($"\t{start_x[0]}..{start_x[^1]} is the same as {zero_x[0]}..{zero_x[^1]}"); + Span z_end = numbers[z..]; + Span z_zero = numbers[z..]; + Console.WriteLine($"\t{z_end[0]}..{z_end[^1]} is the same as {z_zero[0]}..{z_zero[^1]}"); + // + return 0; + } + + internal int ComputeMovingAverages() + { + // + int[] sequence = Sequence(1000); + + + for(int start = 0; start < sequence.Length; start += 100) + { + Range r = start..start+10; + var (min, max, average) = MovingAverage(sequence, r); + Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\tMax: {max},\tAverage: {average}"); + } + + for (int start = 0; start < sequence.Length; start += 100) + { + Range r = ^(start + 10)..^start; + var (min, max, average) = MovingAverage(sequence, r); + Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\tMax: {max},\tAverage: {average}"); + } + + (int min, int max, double average) MovingAverage(int[] subSequence, Range range) => + ( + subSequence[range].Min(), + subSequence[range].Max(), + subSequence[range].Average() + ); + + int[] Sequence(int count) => + Enumerable.Range(0, count).Select(x => (int)(Math.Sqrt(x) * 100)).ToArray(); + // + + return 0; + } + } +} \ No newline at end of file diff --git a/csharp/tutorials/RangesIndexes/Program.cs b/csharp/tutorials/RangesIndexes/Program.cs new file mode 100644 index 00000000000..236aa180891 --- /dev/null +++ b/csharp/tutorials/RangesIndexes/Program.cs @@ -0,0 +1,27 @@ +using System; + +namespace RangesIndexes +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("========== Starting Index and Range Samples. =========="); + var indexSamples = new IndicesAndRanges(); + Console.WriteLine(" ========== Last Index. =========="); + indexSamples.Syntax_LastIndex(); + Console.WriteLine(" ========== Range. =========="); + indexSamples.Syntax_Range(); + Console.WriteLine(" ========== Last Range. =========="); + indexSamples.Syntax_LastRange(); + Console.WriteLine(" ========== Partial Range. =========="); + indexSamples.Syntax_PartialRange(); + Console.WriteLine(" ========== Index and Range types. =========="); + indexSamples.Syntax_IndexRangeType(); + Console.WriteLine(" ========== Why this syntax. =========="); + indexSamples.Syntax_WhyChosenSemantics(); + Console.WriteLine(" ========== Scenario. =========="); + indexSamples.ComputeMovingAverages(); + } + } +} diff --git a/csharp/tutorials/RangesIndexes/RangesIndexes.csproj b/csharp/tutorials/RangesIndexes/RangesIndexes.csproj new file mode 100644 index 00000000000..958d2f1daae --- /dev/null +++ b/csharp/tutorials/RangesIndexes/RangesIndexes.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.0 + + + From e2bbbfe0571ee281631ab1a6b1c75176497f87b6 Mon Sep 17 00:00:00 2001 From: Petr Kulikov Date: Thu, 18 Apr 2019 15:35:09 +0200 Subject: [PATCH 2/4] Arithmetic operators: added example of a compound assignment with cast (#825) --- .../operators/ArithmeticOperators.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/snippets/csharp/language-reference/operators/ArithmeticOperators.cs b/snippets/csharp/language-reference/operators/ArithmeticOperators.cs index 13440c62085..476f362e7ac 100644 --- a/snippets/csharp/language-reference/operators/ArithmeticOperators.cs +++ b/snippets/csharp/language-reference/operators/ArithmeticOperators.cs @@ -28,6 +28,7 @@ public static void Examples() Console.WriteLine("==== Compound assignment"); CompoundAssignment(); + CompoundAssignmentWithCast(); Console.WriteLine("==== Special cases"); CheckedUnchecked(); @@ -194,6 +195,21 @@ private static void CompoundAssignment() // } + private static void CompoundAssignmentWithCast() + { + // + byte a = 200; + byte b = 100; + + var c = a + b; + Console.WriteLine(c.GetType()); // output: System.Int32 + Console.WriteLine(c); // output: 300 + + a += b; + Console.WriteLine(a); // output: 44 + // + } + private static void CheckedUnchecked() { // From d8ad3814d7055c0be0518690700929748b044cd5 Mon Sep 17 00:00:00 2001 From: nnpcYvIVl Date: Thu, 18 Apr 2019 10:35:09 -0500 Subject: [PATCH 3/4] Update ipaddress.cpp (#822) * Update ipaddress.cpp * Update ipaddress.cs * Update ipaddress.vb * Update ipaddress.vb --- .../System.Net.IPAddress/CPP/ipaddress.cpp | 2 +- .../System.Net.IPAddress/CS/ipaddress.cs | 4 ++-- .../System.Net.IPAddress/VB/ipaddress.vb | 13 ++++++------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/snippets/cpp/VS_Snippets_Remoting/System.Net.IPAddress/CPP/ipaddress.cpp b/snippets/cpp/VS_Snippets_Remoting/System.Net.IPAddress/CPP/ipaddress.cpp index 4ea4a9a781e..e7274da84d2 100644 --- a/snippets/cpp/VS_Snippets_Remoting/System.Net.IPAddress/CPP/ipaddress.cpp +++ b/snippets/cpp/VS_Snippets_Remoting/System.Net.IPAddress/CPP/ipaddress.cpp @@ -39,7 +39,7 @@ void IPAddresses( String^ server ) // // Display the type of address family supported by the server. If the - // server is IPv6-enabled this value is: InternNetworkV6. If the server + // server is IPv6-enabled this value is: InterNetworkV6. If the server // is also IPv4-enabled there will be an additional value of InterNetwork. Console::WriteLine( "AddressFamily: {0}", curAdd->AddressFamily ); diff --git a/snippets/csharp/VS_Snippets_Remoting/System.Net.IPAddress/CS/ipaddress.cs b/snippets/csharp/VS_Snippets_Remoting/System.Net.IPAddress/CS/ipaddress.cs index c97b0bb482b..489e797be4e 100644 --- a/snippets/csharp/VS_Snippets_Remoting/System.Net.IPAddress/CS/ipaddress.cs +++ b/snippets/csharp/VS_Snippets_Remoting/System.Net.IPAddress/CS/ipaddress.cs @@ -45,7 +45,7 @@ private static void IPAddresses(string server) // // Display the type of address family supported by the server. If the - // server is IPv6-enabled this value is: InternNetworkV6. If the server + // server is IPv6-enabled this value is: InterNetworkV6. If the server // is also IPv4-enabled there will be an additional value of InterNetwork. Console.WriteLine("AddressFamily: " + curAdd.AddressFamily.ToString()); @@ -152,4 +152,4 @@ public static void Main(string[] args) } } - // \ No newline at end of file + // diff --git a/snippets/visualbasic/VS_Snippets_Remoting/System.Net.IPAddress/VB/ipaddress.vb b/snippets/visualbasic/VS_Snippets_Remoting/System.Net.IPAddress/VB/ipaddress.vb index d7c528c2a1e..ec2ba914ddc 100644 --- a/snippets/visualbasic/VS_Snippets_Remoting/System.Net.IPAddress/VB/ipaddress.vb +++ b/snippets/visualbasic/VS_Snippets_Remoting/System.Net.IPAddress/VB/ipaddress.vb @@ -11,7 +11,6 @@ ' ' This program shows how to use the IPAddress class to obtain a server ' IP addressess and related information. -Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text.RegularExpressions @@ -22,7 +21,10 @@ Namespace Mssc.Services.ConnectionManagement Module M_TestIPAddress Class TestIPAddress - 'The IPAddresses method obtains the selected server IP address information. 'It then displays the type of address family supported by the server and 'its IP address in standard and byte format. + + 'The IPAddresses method obtains the selected server IP address information. + 'It then displays the type of address family supported by the server and + 'its IP address in standard and byte format. Private Shared Sub IPAddresses(ByVal server As String) Try Dim ASCII As New System.Text.ASCIIEncoding() @@ -36,7 +38,7 @@ Namespace Mssc.Services.ConnectionManagement ' ' Display the type of address family supported by the server. If the - ' server is IPv6-enabled this value is: InternNetworkV6. If the server + ' server is IPv6-enabled this value is: InterNetworkV6. If the server ' is also IPv4-enabled there will be an additional value of InterNetwork. Console.WriteLine(("AddressFamily: " + curAdd.AddressFamily.ToString())) @@ -105,9 +107,6 @@ Namespace Mssc.Services.ConnectionManagement ' Define a regular expression to parse user's input. ' This is a security check. It allows only ' alphanumeric input string between 2 to 40 character long. - 'Define a regular expression to parse user's input. - 'This is a security check. It allows only - 'alphanumeric input string between 2 to 40 character long. Dim rex As New Regex("^[a-zA-Z]\w{1,39}$") If args.Length < 1 Then @@ -132,4 +131,4 @@ Namespace Mssc.Services.ConnectionManagement End Class 'TestIPAddress End Module End Namespace -' \ No newline at end of file +' From 2913ab57b86d19c1abebca62df4cfadd1d1474dc Mon Sep 17 00:00:00 2001 From: Ron Petrusha Date: Thu, 18 Apr 2019 13:20:24 -0700 Subject: [PATCH 4/4] Updated version detection code for .NET Framework 4.8 (#789) --- .../csharp/framework/migration-guide/versions-installed3.cs | 4 ++-- .../framework/migration-guide/versions-installed3.vb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/snippets/csharp/framework/migration-guide/versions-installed3.cs b/snippets/csharp/framework/migration-guide/versions-installed3.cs index 786ff3506a6..e5a77cc0f88 100644 --- a/snippets/csharp/framework/migration-guide/versions-installed3.cs +++ b/snippets/csharp/framework/migration-guide/versions-installed3.cs @@ -25,8 +25,8 @@ private static void Get45PlusFromRegistry() // Checking the version using >= enables forward compatibility. string CheckFor45PlusVersion(int releaseKey) { - if (releaseKey > 461814) - return "4.7.2 or later"; + if (releaseKey >= 528049) + return "4.8 or later"; if (releaseKey >= 461808) return "4.7.2"; if (releaseKey >= 461308) diff --git a/snippets/visualbasic/framework/migration-guide/versions-installed3.vb b/snippets/visualbasic/framework/migration-guide/versions-installed3.vb index 9db1fc8e3e5..9d2e0b94eef 100644 --- a/snippets/visualbasic/framework/migration-guide/versions-installed3.vb +++ b/snippets/visualbasic/framework/migration-guide/versions-installed3.vb @@ -19,8 +19,8 @@ Public Module GetDotNetVersion ' Checking the version using >= will enable forward compatibility. Private Function CheckFor45PlusVersion(releaseKey As Integer) As String - If releaseKey > 461814 Then - Return "4.7.2 or later" + If releaseKey >= 528049 Then + Return "4.8 or later" Else If releaseKey >= 461808 Then Return "4.7.2" Else If releaseKey >= 461308 Then