Advertisement
NPSF3000

Are all brackets matched?

Feb 18th, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.09 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5.  
  6. public class Program
  7. {
  8.     public static void Main()
  9.     {
  10.         Console.WriteLine("Testing Started");
  11.         Test(Tuple.Create("A", "B"));
  12.         Test(Tuple.Create("A", "B"), Tuple.Create("C", "D"), Tuple.Create("E", "F"));
  13.         Test(Tuple.Create(true, false));
  14.         Test(Tuple.Create(new { Bracket = "Open" }, new { Bracket = "Close" }));
  15.         Console.WriteLine("Testing Finished");
  16.         Console.ReadLine();
  17.     }
  18.  
  19.     public static void Test<T>(params Tuple<T, T>[] brackets)
  20.     {
  21.         Debug.Assert(brackets != null);
  22.         Action<IEnumerable<T>> AssertT = d =>
  23.            {
  24.                if (!AreBracketsClosed(d, brackets) || !AreBracketsClosedReordered(d, brackets))
  25.                    Debug.Assert(false); //insert breakpoint
  26.            };
  27.         Action<IEnumerable<T>> AssertF = d =>
  28.            {
  29.                if (AreBracketsClosed(d, brackets) || AreBracketsClosedReordered(d, brackets))
  30.                    Debug.Assert(false); //insert breakpoint
  31.            };
  32.  
  33.         AssertT(Enumerable.Empty<T>());
  34.         AssertT(null);
  35.  
  36.         foreach (var b in brackets)
  37.         {
  38.             AssertF(new[] { b.Item2, b.Item1 });
  39.             AssertT(new[] { b.Item1, b.Item2 });
  40.         }
  41.  
  42.         AssertT(brackets.SelectMany(b => new[] { b.Item1, b.Item2 }));
  43.  
  44.         AssertT(Enumerable.Range(0, 10000000)
  45.                 .Select(i => brackets[0].Item1)
  46.             .Concat(Enumerable.Range(0, 10000000)
  47.                 .Select(i => brackets[0].Item2)));
  48.  
  49.     }
  50.  
  51.     public static bool AreBracketsClosed<T>(IEnumerable<T> data, params Tuple<T, T>[] brackets)
  52.     {
  53.         return brackets.All(b => AreBracketsClosed(data, b.Item1, b.Item2));
  54.     }
  55.  
  56.     public static bool AreBracketsClosed<T>(IEnumerable<T> data, T openBracket, T closeBracket)
  57.     {
  58.         if (data == null ||
  59.             EqualityComparer<T>.Default.Equals(openBracket, closeBracket))
  60.             return true;
  61.  
  62.         int count = 0;
  63.         foreach (var d in data)
  64.             if (EqualityComparer<T>.Default.Equals(d, openBracket)) count++;
  65.             else if (EqualityComparer<T>.Default.Equals(d, closeBracket))
  66.                 if (--count < 0) return false;
  67.         return count == 0;
  68.     }
  69.  
  70.     public static bool AreBracketsClosedReordered<T>(IEnumerable<T> data, params Tuple<T, T>[] inBrackets)
  71.     {
  72.         if (data == null) return true;
  73.  
  74.         var brackets = inBrackets
  75.                       .Where(b => !EqualityComparer<T>.Default.Equals(b.Item1, b.Item2))
  76.                       .ToArray();
  77.  
  78.         if (brackets.Length == 0) return true;
  79.         var bracketCount = new int[brackets.Length];
  80.         foreach (var d in data)
  81.             for (int i = 0; i < brackets.Length; i++)
  82.                 if (EqualityComparer<T>.Default.Equals(d, brackets[i].Item1)) bracketCount[i]++;
  83.                 else if (EqualityComparer<T>.Default.Equals(d, brackets[i].Item2))
  84.                     if (--bracketCount[i] < 0) return false;
  85.         return bracketCount.All(i => i == 0);
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement