Csharp: Parallel LINQ


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
/// 
/// geovindu 涂聚文 Geovin Du
/// 
public partial class _Default : Page
{



    /// 
    /// 
    /// 
    /// 
    /// 
    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(
          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
          (() => 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} 
", p.Name)); p.Owner = "Aaron"; }); Parallel.ForEach(GetPokemon().OrderBy(p => p.Name), (p, s, i) => { Response.Write(String.Format("{0}. Changing owner for: {1}
",i,p.Name)); p.Owner = "Aaron"; }); GetPokemon().OrderBy(p => p.Name).AsParallel().ForAll((p) => { Response.Write(String.Format("Changing owner for Du Name: {0}
", p.Name)); p.Owner = "Aaron"; }); } static IEnumerable GetPokemon() => new List { 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; } } /// /// /// public static class Dumper { public static string ToPrettyString(this object value) { return JsonConvert.SerializeObject(value, Formatting.Indented); } public static T Dump(this T value) { Console.WriteLine(value.ToPrettyString()); return value; } } /// /// /// public class Pokemon { /// /// /// /// /// /// public Pokemon(string name, string type, string owner) { Name = name; Type = type; Owner = owner; } /// /// /// public string Name { get; set; } /// /// /// public string Type { get; set; } /// /// /// public string Owner { get; set; } }