Enumerable.SequenceEqual Enumerable.SequenceEqual Enumerable.SequenceEqual Enumerable.SequenceEqual Method

定義

根據相等比較子,判斷兩個序列是否相等。Determines whether two sequences are equal according to an equality comparer.

多載

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

使用項目之型別的預設相等比較子來比較項目,以判斷兩個序列是否相等。Determines whether two sequences are equal by comparing the elements by using the default equality comparer for their type.

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

使用指定的 IEqualityComparer<T> 來比較項目,以判斷兩個序列是否相等。Determines whether two sequences are equal by comparing their elements by using a specified IEqualityComparer<T>.

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

使用項目之型別的預設相等比較子來比較項目,以判斷兩個序列是否相等。Determines whether two sequences are equal by comparing the elements by using the default equality comparer for their type.

public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
 static bool SequenceEqual(System::Collections::Generic::IEnumerable<TSource> ^ first, System::Collections::Generic::IEnumerable<TSource> ^ second);
public static bool SequenceEqual<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second);
static member SequenceEqual : seq<'Source> * seq<'Source> -> bool
<Extension()>
Public Function SequenceEqual(Of TSource) (first As IEnumerable(Of TSource), second As IEnumerable(Of TSource)) As Boolean

類型參數

TSource

輸入序列之項目的類型。The type of the elements of the input sequences.

參數

first
IEnumerable<TSource>

要與 second 比較的 IEnumerable<T>An IEnumerable<T> to compare to second.

second
IEnumerable<TSource>

要與第一個序列比較的 IEnumerable<T>An IEnumerable<T> to compare to the first sequence.

傳回

如果根據其型別的預設相等比較子判斷,兩個來源序列的長度相等,而且其對應項目也相等,則為 true,否則為 falsetrue if the two source sequences are of equal length and their corresponding elements are equal according to the default equality comparer for their type; otherwise, false.

例外狀況

firstsecondnullfirst or second is null.

範例

下列程式碼範例示範如何使用SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)來判斷兩個序列是否相等。The following code examples demonstrate how to use SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) to determine whether two sequences are equal. 在前兩個範例中, 方法會決定比較的序列是否包含相同物件的參考。In the first two examples, the method determines whether the compared sequences contain references to the same objects. 在第三和第四個範例中, 方法會比較序列內物件的實際資料。In the third and fourth examples, the method compares the actual data of the objects within the sequences.

在此範例中, 序列是相等的。In this example the sequences are equal.

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public static void SequenceEqualEx1()
{
    Pet pet1 = new Pet { Name = "Turbo", Age = 2 };
    Pet pet2 = new Pet { Name = "Peanut", Age = 8 };

    // Create two lists of pets.
    List<Pet> pets1 = new List<Pet> { pet1, pet2 };
    List<Pet> pets2 = new List<Pet> { pet1, pet2 };

    bool equal = pets1.SequenceEqual(pets2);

    Console.WriteLine(
        "The lists {0} equal.",
        equal ? "are" : "are not");
}

/*
 This code produces the following output:

 The lists are equal.
*/
Class Pet
    Public Name As String
    Public Age As Integer
End Class

Sub SequenceEqualEx1()
    ' Create two Pet objects.
    Dim pet1 As New Pet With {.Name = "Turbo", .Age = 2}
    Dim pet2 As New Pet With {.Name = "Peanut", .Age = 8}

    ' Create two lists of pets.
    Dim pets1 As New List(Of Pet)(New Pet() {pet1, pet2})
    Dim pets2 As New List(Of Pet)(New Pet() {pet1, pet2})

    'Determine if the two lists are equal.
    Dim equal As Boolean = pets1.SequenceEqual(pets2)

    ' Display the output.
    Dim text As String = IIf(equal, "are", "are not")
    MsgBox("The lists " & text & " equal.")

End Sub

' This code produces the following output:
'
' The lists are equal.

下列程式碼範例會比較兩個不相等的序列。The following code example compares two sequences that are not equal. 請注意, 序列包含相同的資料, 但因為其包含的物件有不同的參考, 所以不會將序列視為相等。Note that the sequences contain identical data, but because the objects that they contain have different references, the sequences are not considered equal.

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public static void SequenceEqualEx2()
{
    Pet pet1 = new Pet() { Name = "Turbo", Age = 2 };
    Pet pet2 = new Pet() { Name = "Peanut", Age = 8 };

    // Create two lists of pets.
    List<Pet> pets1 = new List<Pet> { pet1, pet2 };
    List<Pet> pets2 =
        new List<Pet> { new Pet { Name = "Turbo", Age = 2 }, 
                        new Pet { Name = "Peanut", Age = 8 } };

    bool equal = pets1.SequenceEqual(pets2);

    Console.WriteLine("The lists {0} equal.", equal ? "are" : "are not");
}

/*
 This code produces the following output:

 The lists are not equal.
*/
' Create two Pet objects.
Dim pet1 As New Pet With {.Name = "Turbo", .Age = 2}
Dim pet2 As New Pet With {.Name = "Peanut", .Age = 8}

' Create two lists of pets.
Dim pets1 As New List(Of Pet)()
pets1.Add(pet1)
pets1.Add(pet2)

Dim pets2 As New List(Of Pet)()
pets2.Add(New Pet With {.Name = "Turbo", .Age = 2})
pets2.Add(New Pet With {.Name = "Peanut", .Age = 8})

' Determine if the two lists are equal.
Dim equal As Boolean = pets1.SequenceEqual(pets2)

' Display the output.
Dim text As String = IIf(equal, "are", "are not")
MsgBox("The lists " & text & " equal.")

' This code produces the following output:
'
' The lists are not equal.

如果您想要比較序列中物件的實際資料, 而不只是比較其參考, 您必須在類別中執行IEqualityComparer<T>泛型介面。If you want to compare the actual data of the objects in the sequences instead of just comparing their references, you have to implement the IEqualityComparer<T> generic interface in your class. 下列程式碼範例示範如何在 helper 類別中執行此介面, 並提供GetHashCodeEquals方法。The following code example shows how to implement this interface in a helper class and provide GetHashCode and Equals methods.

public class ProductA: IEquatable<ProductA>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(ProductA other)
    {
        if (other is null)
            return false;

        return this.Name == other.Name && this.Code == other.Code;
    }

    public override bool Equals(object obj) => Equals(obj as ProductA);
    public override int GetHashCode() => (Name, Code).GetHashCode();
}
Public Class ProductA
    Inherits IEquatable(Of ProductA)

    Public Property Name As String
    Public Property Code As Integer

    Public Function Equals(ByVal other As ProductA) As Boolean
        If other Is Nothing Then Return False
        Return Me.Name = other.Name AndAlso Me.Code = other.Code
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return Equals(TryCast(obj, ProductA))
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return (Name, Code).GetHashCode()
    End Function

End Class

在您執行此介面之後, 您可以ProductA SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)在方法中使用物件的序列, 如下列範例所示:After you implement this interface, you can use sequences of ProductA objects in the SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) method, as shown in the following example:


ProductA[] storeA = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "orange", Code = 4 } };

ProductA[] storeB = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "orange", Code = 4 } };

bool equalAB = storeA.SequenceEqual(storeB);

Console.WriteLine("Equal? " + equalAB);

/*
    This code produces the following output:
    
    Equal? True
*/
Dim storeA() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}}

Dim storeB() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}}

Dim equalAB = storeA.SequenceEqual(storeB)

Console.WriteLine("Equal? " & equalAB)

' This code produces the following output:

' Equal? True

備註

方法會平行列舉兩個來源序列, 並使用的預設相等TSource比較Default子來比較對應的元素。 SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)The SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) method enumerates the two source sequences in parallel and compares corresponding elements by using the default equality comparer for TSource, Default.

預設的相等比較Default子是用來比較類型的值。The default equality comparer, Default, is used to compare values of the types. 若要比較自訂資料類型, 您必須覆寫Equals GetHashCode和方法IEquatable<T> , 並選擇性地在自訂類型中執行泛型介面。To compare a custom data type, you need to override the Equals and the GetHashCode methods, and optionally implement the IEquatable<T> generic interface in the custom type. 如需詳細資訊,請參閱 Default 屬性 (Property)。For more information, see the Default property.

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

使用指定的 IEqualityComparer<T> 來比較項目,以判斷兩個序列是否相等。Determines whether two sequences are equal by comparing their elements by using a specified IEqualityComparer<T>.

public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
 static bool SequenceEqual(System::Collections::Generic::IEnumerable<TSource> ^ first, System::Collections::Generic::IEnumerable<TSource> ^ second, System::Collections::Generic::IEqualityComparer<TSource> ^ comparer);
public static bool SequenceEqual<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource> comparer);
static member SequenceEqual : seq<'Source> * seq<'Source> * System.Collections.Generic.IEqualityComparer<'Source> -> bool
<Extension()>
Public Function SequenceEqual(Of TSource) (first As IEnumerable(Of TSource), second As IEnumerable(Of TSource), comparer As IEqualityComparer(Of TSource)) As Boolean

類型參數

TSource

輸入序列之項目的類型。The type of the elements of the input sequences.

參數

first
IEnumerable<TSource>

要與 second 比較的 IEnumerable<T>An IEnumerable<T> to compare to second.

second
IEnumerable<TSource>

要與第一個序列比較的 IEnumerable<T>An IEnumerable<T> to compare to the first sequence.

comparer
IEqualityComparer<TSource>

用來比較項目的 IEqualityComparer<T>An IEqualityComparer<T> to use to compare elements.

傳回

如果根據 comparer 判斷,兩個來源序列的長度相等,而且其對應項目的比較也相等,則為 true,否則為 falsetrue if the two source sequences are of equal length and their corresponding elements compare equal according to comparer; otherwise, false.

例外狀況

firstsecondnullfirst or second is null.

範例

下列範例顯示如何執行可用於SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)方法的相等比較子。The following example shows how to implement an equality comparer that can be used in the SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) method.

public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}

// Custom comparer for the Product class
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Product x, Product y)
    {
       
        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal.
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(Product product)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(product, null)) return 0;

        //Get hash code for the Name field if it is not null.
        int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

        //Get hash code for the Code field.
        int hashProductCode = product.Code.GetHashCode();

        //Calculate the hash code for the product.
        return hashProductName ^ hashProductCode;
    }

}
Public Class Product
    Public Property Name As String
    Public Property Code As Integer
End Class

' Custom comparer for the Product class
Public Class ProductComparer
    Implements IEqualityComparer(Of Product)

    Public Function Equals1(
        ByVal x As Product, 
        ByVal y As Product
        ) As Boolean Implements IEqualityComparer(Of Product).Equals

        ' Check whether the compared objects reference the same data.
        If x Is y Then Return True

        'Check whether any of the compared objects is null.
        If x Is Nothing OrElse y Is Nothing Then Return False

        ' Check whether the products' properties are equal.
        Return (x.Code = y.Code) AndAlso (x.Name = y.Name)
    End Function

    Public Function GetHashCode1(
        ByVal product As Product
        ) As Integer Implements IEqualityComparer(Of Product).GetHashCode

        ' Check whether the object is null.
        If product Is Nothing Then Return 0

        ' Get hash code for the Name field if it is not null.
        Dim hashProductName = 
            If(product.Name Is Nothing, 0, product.Name.GetHashCode())

        ' Get hash code for the Code field.
        Dim hashProductCode = product.Code.GetHashCode()

        ' Calculate the hash code for the product.
        Return hashProductName Xor hashProductCode
    End Function
End Class

在您執行此比較子之後, 您可以Product SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)在方法中使用物件的序列, 如下列範例所示:After you implement this comparer, you can use sequences of Product objects in the SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) method, as shown in the following example:


Product[] storeA = { new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "orange", Code = 4 } };

Product[] storeB = { new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "orange", Code = 4 } };

bool equalAB = storeA.SequenceEqual(storeB, new ProductComparer());

Console.WriteLine("Equal? " + equalAB);

/*
    This code produces the following output:
    
    Equal? True
*/


Dim storeA() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}}

Dim storeB() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}}

Dim equalAB = storeA.SequenceEqual(storeB, New ProductComparer())

Console.WriteLine("Equal? " & equalAB)

' This code produces the following output:

' Equal? True

備註

方法會平行列舉兩個來源序列, 並使用指定IEqualityComparer<T>的來比較對應的元素。 SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)The SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) method enumerates the two source sequences in parallel and compares corresponding elements by using the specified IEqualityComparer<T>. 如果comparer Defaultnull, 則會使用預設的相等比較子來比較元素。If comparer is null, the default equality comparer, Default, is used to compare elements.

適用於