Экспорт (0) Печать
Развернуть все
Данная статья переведена автоматически. Наведите указатель мыши на предложения статьи, чтобы просмотреть исходный текст. Дополнительные сведения.
Перевод
Текст оригинала

Enumerable.SequenceEqual<TSource> - метод (IEnumerable<TSource>, IEnumerable<TSource>)

Определяет, совпадают ли две последовательности, используя для сравнения элементов компаратор проверки на равенство по умолчанию, предназначенный для их типа.

Пространство имен:  System.Linq
Сборка:  System.Core (в System.Core.dll)

public static bool SequenceEqual<TSource>(
	this IEnumerable<TSource> first,
	IEnumerable<TSource> second
)

Параметры типа

TSource

Тип элементов входных последовательностей.

Параметры

first
Тип: System.Collections.Generic.IEnumerable<TSource>
Объект IEnumerable<T>, сравниваемый с последовательностью second.
second
Тип: System.Collections.Generic.IEnumerable<TSource>
Объект IEnumerable<T>, сравниваемый с первой последовательностью.

Возвращаемое значение

Тип: System.Boolean
true , если у двух исходных последовательностей одинаковая длина и соответствующие элементы совпадают, согласно компаратору проверки на равенство по умолчанию для этого типа элементов, в противном случае — false.

Примечание об использовании

В Visual Basic и C# этот метод можно вызывать как метод экземпляра для любого объекта типа IEnumerable<TSource>. При вызове метода для экземпляра следует опускать первый параметр. Дополнительные сведения см. в разделе Методы расширения (Visual Basic) или Методы расширения (Руководство по программированию в C#).

ИсключениеУсловие
ArgumentNullException

Значение параметра first или secondnull.

Метод SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) выполняет параллельное перечисление двух исходных последовательностей и сравнивает соответствующие элементы, используя компаратор проверки на равенство, применяемый по умолчанию для типа TSource, — Default. Компаратор проверки на равенство по умолчанию Default используется для сравнения значений типов, которые реализуют универсальный интерфейс IEqualityComparer<T>. Чтобы сравнить пользовательский тип данных, необходимо реализовать этот интерфейс и предоставить собственные методы GetHashCode и Equals для типа.

В следующих примерах кода демонстрируется использование метода SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) для того, чтобы определить, совпадают ли две последовательности. В первых двух примерах метод определяет, содержат ли сравниваемые последовательности ссылки на те же объекты. В третьем и четвертом примерах, метод сравнивает фактические данные объектов последовательности.

В этом примере последовательности совпадают.


            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 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.
            */



Для сравнения фактических данных объектов в последовательностях, вместо простого сравнения их ссылок, необходимо реализовывать в классе универсальный интерфейс IEqualityComparer<T>. В следующем примере кода показано, как реализовать этот интерфейс в вспомогательном классе и предоставить GetHashCode и методы Equals.


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

public class ProductComparer : IEqualityComparer<ProductA>
{

    public bool Equals(ProductA x, ProductA y)
    {
        //Check whether the objects are the same object. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether the products' properties are equal. 
        return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
    }

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

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

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


После реализации этого интерфейса можно использовать последовательности объектов ProductA в методе SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>), как показано в следующем примере.



        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
        */



.NET Framework

Поддерживается в версиях: 4.5.2, 4.5.1, 4.5, 4, 3.5

.NET Framework (клиентский профиль)

Поддерживается в версиях: 4, 3.5 с пакетом обновления 1 (SP1)

Переносимая библиотека классов

Поддерживается в версии: Переносимая библиотека классов

Приложения .NET для Магазина Windows

Поддерживается в версии: Windows 8

Приложения .NET для Windows Phone

Поддерживается в версиях: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows Server 2008 (роль основных серверных компонентов не поддерживается), Windows Server 2008 R2 (роль основных серверных компонентов поддерживается в пакете обновления 1 (SP1) или выше; системы на базе Itanium не поддерживаются)

.NET Framework поддерживает не все версии каждой платформы. Поддерживаемые версии перечислены в разделе Требования к системе для .NET Framework.

Добавления сообщества

ДОБАВИТЬ
Показ:
© 2014 Microsoft