Ключевое слово Linq "равно" - PullRequest
       21

Ключевое слово Linq "равно"

2 голосов
/ 15 декабря 2009

Будет ли ключевое слово "равно" в LINQ проверять наличие объектов слева и справа на одинаковые память или проверить их содержимое?

Ответы [ 4 ]

2 голосов
/ 15 декабря 2009

Сравнивает значения .

Также см. Linq: В чем разница между == и равно в соединении?

1 голос
/ 15 декабря 2009

Это зависит от объекта. Если это тип значения, обычно сравниваются значения, это ссылочный тип, ссылки сравниваются, если только метод Equals () не переопределен.

С MSDN :

Реализация по умолчанию Equals поддерживает ссылочное равенство для ссылочные типы и битовое равенство для типов значений. Справочное равенство означает ссылки на объекты, которые по сравнению относятся к одному и тому же объекту. Побитовое равенство означает объекты сравниваемые имеют одинаковые двоичные представление.

Обратите внимание, что производный тип может переопределить метод Equals для реализовать равенство значений.

0 голосов
/ 15 декабря 2009

Из MSDN: http://msdn.microsoft.com/en-us/library/bb311040.aspx

Оператор равенства

Предложение объединения выполняет эквиджоин. Другими словами, вы можете основывать совпадения только на равенстве двух ключей. Другие типы сравнений, такие как «больше чем» или «не равно», не поддерживаются. Чтобы прояснить, что все объединения являются равносильными, в предложении объединения используется ключевое слово equals вместо оператора ==. Ключевое слово equals может использоваться только в предложении объединения, и оно отличается от оператора == одним важным способом. При равенстве левая клавиша потребляет последовательность внешнего источника, а правая клавиша потребляет внутренний источник. Внешний источник находится только в области видимости с левой стороны от equals, а внутренний источник находится только в области видимости справа.

0 голосов
/ 15 декабря 2009

«Равен» в запросе на соединение использует средство сравнения по умолчанию для сравнения ключей с использованием поиска по ключам. Объединение реализовано в Enumerable.Join, и ключ может быть либо значением, либо ссылкой. При запросе с использованием Linq для Sql ключ обычно является значением, поскольку первичные ключи обычно отображаются на типы значений. Однако, как показано в следующем коде, сравнение равно может быть либо по значению, либо по ссылке, которая всегда подходит для типа ключа:

KeyObj k1 = new KeyObj(); k1.Id = 1001;
        KeyObj k2 = new KeyObj(); k2.Id = 1002;
        KeyObj k3 = new KeyObj(); k3.Id = 1003;
        KeyObj k4 = new KeyObj(); k4.Id = 1004;
        KeyObj k5 = new KeyObj(); k4.Id = 1005;

        List<Foo> foos = 
            new List<Foo>()
            {
                new Foo("o1",k1),
                new Foo("o2",k2),
                new Foo("o4",k5)
            };

        List<Bar> bars =
            new List<Bar>()
            {
                new Bar("o2",k1),
                new Bar("o3",k2),
                new Bar("o4",k4),
                new Bar("o5",k5)
            };


        var foobar = from f in foos
                     join b in bars on f.Ko equals b.Ko
                     select f.Name + " in foos joined by reference with " + b.Name + " in bars ";

        foreach (var v in foobar)
        {
            Debug.WriteLine(v);
        }

        foobar = from f in foos
                 join b in bars on f.Name equals b.Name
                 select f.Name + " in foos joined by value with " + b.Name + " in bars ";

        foreach (var v in foobar)
        {
            Debug.WriteLine(v);
        }

class KeyObj { public int Id { get; set; } }

class Foo : Base
{
    public Foo(string s, KeyObj ko) : base(s, ko) { }
}

class Bar : Base
{
    public Bar(string s, KeyObj ko) : base(s, ko) { }
}

class Base
{
    string _name = "";
    public string Name { get { return _name; }}

    KeyObj _ko = null;
    public KeyObj Ko { get { return _ko; }}

    public Base(string s, KeyObj ko)
    {
        _name = s;
        _ko = ko;
    }
}

Выходные данные:

o1 в foos, соединенных ссылкой с o2 в барах

o2 в foos, соединенных ссылкой с o3 в барах

o4 в foos, соединенных ссылкой с o5 в барах

o2 в foos, соединенных по значению с o2 в барах

o4 в foos, соединенных по значению с o4 в барах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...