Think LINQ – .SequenceEqual()
Up until March 26, I had come up with a number of crazy concoctions to test whether one IEnumerable<>
was equal to another. Some of them chained together .Intersect()
with .Count()
, comparing the count of the elements in the intersected set with the count of the elements in each of the two sets. (If the count of A∩B is equal to the count of A and the count of B, then A and B are equal.)
That method was mostly rubbish.
What I have since learned is that there is a relatively efficient LINQ operator called .SequenceEqual()
that compares two ordered IEnumerable<>
s. If each of the IEnumerable<>
s contain equal elements in the same order, the IEnumerable<>
s are equal. Simple. Straightforward. Useful.
IEnumerable<string> stringsTheFirst = new string[] { "one", "two", "three" };
IEnumerable<string> stringsTheSecond = new string[] { "one", "two", "three" };
bool stringsAreEqual = stringsTheFirst.SequenceEqual(stringsTheSecond);
And if your IEnumerable<>
s are not already ordered for you, the pattern then becomes:
IEnumerable<string> stringsTheFirst = new string[] { "two", "one", "three" };
IEnumerable<string> stringsTheSecond = new string[] { "one", "two", "three" };
bool stringsAreEqual = stringsTheFirst.OrderBy(s => s).SequenceEqual(stringsTheSecond.OrderBy(s => s));