[Fork] [Fork] [Fork] https://stackoverflow.com/questions/56638368/sort-by-most-occurring-string-from-json-by-key-order-and-order-contains-array-it

CSharp · Console

/Program.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters;
using System.IO;
using System.Data;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Reflection;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;	

using NUnit.Framework; // Throws NUnit.Framework.AssertionException

//https://stackoverflow.com/questions/56638368/sort-by-most-occurring-string-from-json-by-key-order-and-order-contains-array-it?noredirect=1

	public class Order 
	{
        public string[] order { get; set; }
    }

	public class IEnumerableComparer<TEnumerable, TElement> : IEqualityComparer<TEnumerable> where TEnumerable : IEnumerable<TElement>
	{
		//Adapted from IEqualityComparer for SequenceEqual
		//https://stackoverflow.com/questions/14675720/iequalitycomparer-for-sequenceequal
		//Answer https://stackoverflow.com/a/14675741 By Cédric Bignon https://stackoverflow.com/users/1284526/c%C3%A9dric-bignon 
		public bool Equals(TEnumerable x, TEnumerable y)
		{
			return Object.ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y));
		}

		public int GetHashCode(TEnumerable obj)
		{
			// Will not throw an OverflowException
			unchecked
			{
				return obj.Where(e => e != null).Select(e => e.GetHashCode()).Aggregate(17, (a, b) => 23 * a + b);
			}
		}
	}

    class TestClass
    {
        public static void Test()
        {
			var jsonString = GetJson();
			
			var items = JsonConvert.DeserializeObject<List<Order>>(jsonString);
			
			var query = items
				//If order items aren't already sorted, you may need to do so first.
				//use StringComparer.OrdinalIgnoreCase or StringComparer.Ordinal or StringComparer.CurrentCulture as required.
				.Select(i => i.order.OrderBy(s => s, StringComparer.Ordinal).ToArray()) 
				//Adapted from writing a custom comparer for linq groupby
				//https://stackoverflow.com/questions/37733773/writing-a-custom-comparer-for-linq-groupby
				//Answer https://stackoverflow.com/a/37734601 by Gert Arnold https://stackoverflow.com/users/861716/gert-arnold
				.GroupBy(s => s, new IEnumerableComparer<string [], string>())
				.OrderByDescending(g => g.Count())
				.SelectMany(g => g)
				.Select(a => new Order { order = a });
						
			var sortedItems = query.ToList();
			
			Console.WriteLine(JsonConvert.SerializeObject(sortedItems, Formatting.Indented));
		}	
		
		static string GetJson()
		{
			var json = @"[{ ""order"":[""Order1""]},{ ""order"":[""Order2""]}, { ""order"":[""Order2"", ""Order3""]}, { ""order"":[""Order1"", ""Order2""]}, { ""order"":[""Order2"", ""Order3""]}]
";
			return json;
		}
	}

	public class Program
	{
		public static void Main()
		{
			Console.WriteLine("Environment version: " + Environment.Version);
			Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
			Console.WriteLine();

			try
			{
				TestClass.Test();
			}
			catch (Exception ex)
			{
				Console.WriteLine("Failed with unhandled exception: ");
				Console.WriteLine(ex);
				throw;
			}
		}
	}
;