Returns true if two collections contain the same elements regardless of order, false otherwise.

  • Use IEnumerable.GroupBy() to create groups for each distinct value in each collection, IEnumerable.ToDictionary() to convert the result to a Dictionary.
  • Use IEnumerable.Union() and IEnumerable.Distinct() to find the distinct values from both collections and loop over them using a foreach loop.
  • Use Dictionary.ContainsKey() to check that each distinct value exists in both collections and compare the count for each one.
  • Return false if any value is not found in either collection or if any count does not match, true otherwise.
using System.Collections.Generic;
using System.Linq;

public static partial class _30s 
  public static bool HaveSameContents<T>(IEnumerable<T> a, IEnumerable<T> b)
    Dictionary<T,int> dA = a.GroupBy(v => v).ToDictionary(v => v.Key, v => v.Count());
    Dictionary<T,int> dB = b.GroupBy(v => v).ToDictionary(v => v.Key, v => v.Count());
    foreach (T val in a.Union(b).Distinct()) {
      if (!dA.ContainsKey(val) || !dB.ContainsKey(val)) return false;
      if (dA[val] != dB[val]) return false;
    return true;
int[] a = {1, 2, 4};
int[] b = {2, 4, 1};

_30s.HaveSameContents(a, b); // true