https://devtut.github.io/csharp/parallel-linq-plinq.html#simple-example
https://github.com/PacktPublishing/Hands-On-Parallel-Programming-with-C-8-and-.NET-Core-3.0
https://gist.github.com/gfoidl/d8250ff11a5c70972cb8164622792ba1
https://github.com/lassevk/ObjectDumper
https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/order-preservation-in-plinq
LINQPad
https://github.com/giawa/RedPandaOS
http://www.albahari.com/nutshell/E9-CH22.aspx
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10
https://github.com/WolfgangOfner/CSharp-9.0/tree/master/CSharp9
https://github.com/apress/beg-cpp
https://github.com/Apress/beginning-cpp20
https://github.com/packtpublishing/beginning-cpp-programming
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections; using System.Linq.Expressions; using System.IO; using System.Net; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; //https://devtut.github.io/csharp/parallel-linq-plinq.html#simple-example /// <summary> /// geovindu 涂聚文 Geovin Du /// </summary> public partial class _Default : Page { /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { var sequence = Enumerable.Range(1, 10000).Select(x => -1 * x); // -1, -2, ... var evenNumbers = sequence.AsParallel() .OrderBy(x => x) .Take(5000) .AsUnordered() .Where(x => x % 2 == 0) // This line won't be affected by ordering .ToList(); string wordLookupFile = Path.Combine(Path.GetTempPath(), "WordLookup.txt"); if (!File.Exists(wordLookupFile)) // Contains about 150,000 words new WebClient().DownloadFile( "http://www.dusystem.com/allwords.txt", wordLookupFile); var wordLookup = new HashSet<string>( File.ReadAllLines(wordLookupFile), StringComparer.InvariantCultureIgnoreCase); string[] wordList = wordLookup.ToArray(); // Here, we're using ThreadLocal to generate a thread-safe random number generator, // so we can parallelize the building of the wordsToTest array. var localRandom = new ThreadLocal<Random> (() => new Random(Guid.NewGuid().GetHashCode())); string[] wordsToTest = Enumerable.Range(0, 1000000).AsParallel() .Select(i => wordList[localRandom.Value.Next(0, wordList.Length)]) .ToArray(); wordsToTest[12345] = "woozsh"; // Introduce a couple wordsToTest[23456] = "wubsie"; // of spelling mistakes. var query = wordsToTest .AsParallel() .Select((word, index) => new IndexedWord { Word = word, Index = index }) .Where(iword => !wordLookup.Contains(iword.Word)) .OrderBy(iword => iword.Index); query.Dump(); //Dump string text = "Let’s suppose this is a really long string"; int[] result = text.AsParallel().Aggregate( () => new int[26], // Create a new local accumulator (localFrequencies, c) => // Aggregate into the local accumulator { int index = char.ToUpper(c) - 'A'; if (index >= 0 && index <= 26) localFrequencies[index]++; return localFrequencies; }, // Aggregate local->main accumulator (mainFreq, localFreq) => mainFreq.Zip(localFreq, (f1, f2) => f1 + f2).ToArray(), finalResult => finalResult // Perform any final transformation ); // on the end result. result.Dump(); Parallel.ForEach(GetPokemon().OrderBy(p => p.Name), (p,s) => { Response.Write(String.Format("Changing owner for {0} <br/>", p.Name)); p.Owner = "Aaron"; }); Parallel.ForEach(GetPokemon().OrderBy(p => p.Name), (p, s, i) => { Response.Write(String.Format("{0}. Changing owner for: {1}<br/>",i,p.Name)); p.Owner = "Aaron"; }); GetPokemon().OrderBy(p => p.Name).AsParallel().ForAll((p) => { Response.Write(String.Format("Changing owner for Du Name: {0}<br/>", p.Name)); p.Owner = "Aaron"; }); } static IEnumerable<Pokemon> GetPokemon() => new List<Pokemon> { new Pokemon("Pikachu", "Electric", "Ash"), new Pokemon("Bulbasaur", "Grass", "Ash"), new Pokemon("Squirtle", "Water", "Ash"), new Pokemon("Charmander", "Fire", "Aaron"), new Pokemon("Gengar", "Ghost", "Ash"), new Pokemon("Snorlax", "Normal", "Ash"), new Pokemon("Geovin Du", "Psychic", "Ash"), }; struct IndexedWord { public string Word; public int Index; } } /// <summary> /// /// </summary> public static class Dumper { public static string ToPrettyString(this object value) { return JsonConvert.SerializeObject(value, Formatting.Indented); } public static T Dump<T>(this T value) { Console.WriteLine(value.ToPrettyString()); return value; } } /// <summary> /// /// </summary> public class Pokemon { /// <summary> /// /// </summary> /// <param name="name"></param> /// <param name="type"></param> /// <param name="owner"></param> public Pokemon(string name, string type, string owner) { Name = name; Type = type; Owner = owner; } /// <summary> /// /// </summary> public string Name { get; set; } /// <summary> /// /// </summary> public string Type { get; set; } /// <summary> /// /// </summary> public string Owner { get; set; } }