Mega Code Archive

 
Categories / C# / Development Class
 

Permutation demo

//----------------------------------------------------------------------- // <copyright file="Permutation.cs" //            project="SteelGame" //            assembly="SteelGame" //            solution="Steel" //            company="Opuno"> //     Copyright (c) Opuno. All rights reserved. // </copyright> // <author id="">Andreas Brekken</author> // <summary></summary> //----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Opuno.Steel.Utils {     public static class Permutation     {         public static IEnumerable<List<int>> WaysToMake(int components, int highestNumber)         {             var distinct = false;             var componentN = components - 1;             var current = new List<int>();             for (int i = 0; i < components; i++)             {                 current.Add(1);             }             while (true)             {                 yield return current.ToList();                 while (componentN > 0 && current[componentN] == (distinct ? current[componentN - 1] : highestNumber))                 {                     componentN--;                 }                 if (componentN == 0 && current[0] == highestNumber)                 {                     yield break;                 }                 current[componentN] += 1;                 for (int i = componentN + 1; i < components; i++)                 {                     current[i] = 1;                 }                 componentN = components - 1;             }         }         public class ListEqualityComparer : IEqualityComparer<List<int>>         {             public static readonly ListEqualityComparer Instance = new ListEqualityComparer();             public bool Equals(List<int> x, List<int> y)             {                 if (x.Count != y.Count)                 {                     return false;                 }                 if (x == y)                 {                     return true;                 }                 for (int i = 0; i < x.Count; i++)                 {                     if (!x[i].Equals(y[i]))                     {                         return false;                     }                 }                 return true;             }             public int GetHashCode(List<int> obj)             {                 var result = 0;                 for (int i = 0; i < obj.Count; i++)                 {                     result ^= obj[i];                 }                 return result;             }         }         public static IEnumerable<List<int>> DisregardOrder(IEnumerable<List<int>> combinations)         {             return combinations.Select(combination => combination.OrderBy(k => k).ToList()).Distinct(ListEqualityComparer.Instance);         }     } }