Multiple Approaches for Array Comparison in C# and Performance Analysis

Nov 22, 2025 · Programming · 9 views · 7.8

Keywords: C# | Array Comparison | Enumerable.SequenceEqual | Performance Optimization | LINQ

Abstract: This article comprehensively explores various methods for comparing arrays in C#, including Enumerable.SequenceEqual, loop-based comparison, AsSpan().SequenceEqual(), and more. Through in-depth analysis of each method's implementation principles, applicable scenarios, and performance characteristics, it helps developers choose the most suitable array comparison solution based on specific requirements. The article provides detailed code examples and benchmark test results, demonstrating differences in efficiency and functionality among different approaches.

Introduction

In C# development, array comparison is a common requirement. Similar to Java's Arrays.equals() method, C# provides multiple built-in methods for comparing array contents. This article will deeply explore these methods, analyzing their implementation principles and performance characteristics.

Using Enumerable.SequenceEqual Method

Enumerable.SequenceEqual is a powerful method provided by LINQ that can be used to compare any collection implementing the IEnumerable<T> interface, including arrays. This method compares each element in two sequences in order.

int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = new int[] { 1, 2, 3 };
bool result = arr1.SequenceEqual(arr2); // Returns true

For value type arrays, SequenceEqual directly compares element values. However, special attention is needed when comparing reference type arrays.

Comparing Reference Type Arrays

When comparing arrays containing custom objects, custom comparison logic needs to be provided. This can be achieved by implementing the IEqualityComparer<T> interface to define comparison rules:

public class Article : IEqualityComparer<Article>
{
    public string Title { get; set; }
    public DateTime LastUpdate { get; set; }
    
    public bool Equals(Article first, Article second)
    {
        return first?.Title == second?.Title && 
               first?.LastUpdate == second?.LastUpdate;
    }
    
    public int GetHashCode(Article obj)
    {
        return HashCode.Combine(obj.Title, obj.LastUpdate);
    }
}

// Using custom comparer
var articleArray1 = new Article[] { /* initialization */ };
var articleArray2 = new Article[] { /* initialization */ };
bool areEqual = articleArray1.SequenceEqual(articleArray2, new Article());

Manual Loop Comparison

In addition to using built-in methods, array comparison logic can be manually implemented:

public static bool CompareArrays(int[] first, int[] second)
{
    if (first.Length != second.Length)
        return false;
        
    for (int i = 0; i < first.Length; i++)
    {
        if (first[i] != second[i])
            return false;
    }
    return true;
}

This approach provides maximum flexibility, allowing customization of comparison logic based on specific requirements.

Using AsSpan().SequenceEqual()

For performance-sensitive scenarios, the AsSpan().SequenceEqual() method can be used:

public static bool CompareWithSpan(int[] first, int[] second)
{
    return first.AsSpan().SequenceEqual(second);
}

This method avoids certain overhead and typically exhibits better performance than Enumerable.SequenceEqual.

Reference Equality Comparison

It's important to note that directly using the equality operator (==) or ReferenceEquals method compares array references rather than contents:

int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = new int[] { 1, 2, 3 };
bool referenceEqual = arr1 == arr2; // Returns false
bool referenceEquals = ReferenceEquals(arr1, arr2); // Returns false

These methods only return true when two variables reference the same array instance.

Performance Analysis

Performance differences among various methods can be compared through benchmark testing using arrays containing 1 million elements:

The results show that for content comparison, AsSpan().SequenceEqual() is typically the fastest choice.

Using IStructuralEquatable Interface

Arrays implement the IStructuralEquatable interface, providing another comparison approach:

IStructuralEquatable structuralEquatable = firstArray;
bool result = structuralEquatable.Equals(secondArray, 
    StructuralComparisons.StructuralEqualityComparer);

Although this method is powerful, it performs poorly in performance tests and is suitable for specific scenarios requiring structural comparison.

Practical Application Recommendations

When choosing array comparison methods, consider the following factors:

  1. Performance Requirements: For large arrays, prioritize AsSpan().SequenceEqual()
  2. Code Simplicity: Enumerable.SequenceEqual offers the best readability
  3. Custom Logic: Manual implementation may be more appropriate when complex comparison logic is needed
  4. Type Safety: Ensure comparison logic properly handles null values and type conversions

Conclusion

C# provides rich options for array comparison, ranging from simple reference comparison to complex content comparison. Enumerable.SequenceEqual, as the most versatile method, is suitable for most scenarios. In performance-critical situations, AsSpan().SequenceEqual() provides better efficiency. Developers should choose the most appropriate method based on specific requirements, balancing performance, readability, and functional needs.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.