Действительно Перечисляет <>.IndexOf, выдерживают сравнение ссылкой или значением?

Я заметил ошибку в моем предыдущем примере, так что вот обновление. ПРИМЕЧАНИЕ: запрос сравнивает текущую неделю с предыдущей. Я надеюсь, что это то, что вам нужно.

SELECT
    Date,
    SUM(CASE week WHEN 0 THEN accounts_credited ELSE 0 END) AS 'Accounts credited',
    SUM(CASE week WHEN 0 THEN total_credited ELSE 0 END) AS 'Total Credited',
    100 * (
        SUM(CASE week WHEN 0 THEN total_credited ELSE 0 END) - SUM(CASE week WHEN 1 THEN total_credited ELSE 0 END)
    ) / SUM(CASE week WHEN 1 THEN total_credited ELSE 0 END) AS 'Difference in %'
FROM
(SELECT
    DATE_FORMAT(created, '%Y-%m-%d') as 'Date',
    COUNT(id) AS 'accounts_credited',
    SUM(withdrawal) 'total_credited',
    0 AS 'week'
FROM 
    statements
WHERE 
    status_id IN ('OPEN','PENDING')
AND
    YEARWEEK(created, 1) = YEARWEEK(CURDATE(), 1)
GROUP BY 
    DATE(created)
UNION
SELECT
    DATE_FORMAT(created, '%Y-%m-%d') as 'Date',
    COUNT(id) AS 'accounts_credited',
    SUM(withdrawal) 'total_credited',
    1 AS 'week'
FROM 
    statements
WHERE 
    status_id IN ('OPEN','PENDING')
AND
    (
    DATE(created) >= CURDATE() - INTERVAL DAYOFWEEK(CURDATE())+6 DAY
    AND 
    DATE(created) < CURDATE() - INTERVAL DAYOFWEEK(CURDATE())-1 DAY
    )
GROUP BY 
    DATE(created)
) AS tmp
ORDER BY Date
GROUP BY Date
6
задан Tom Ritter 6 October 2008 в 20:05
поделиться

5 ответов

Из MSDN:

Этот метод определяет равенство с помощью компаратора EqualityComparer <T>.Default равенства по умолчанию для T, типа значений в списке.

Свойство Default проверяет, реализует ли тип T Систему. IEquatable <T> универсальный интерфейс и раз так возвращает EqualityComparer <T>, который использует ту реализацию. Иначе это возвращает EqualityComparer <T>, который использует переопределения Объекта. Равняется и Объект. GetHashCode обеспечивается T.

Кажется, что это использует, Равняется методу, если сохраненный класс не реализует интерфейс <T> IEquatable.

16
ответ дан 8 December 2019 в 12:24
поделиться

Это зависит от реализации объекта.Equals (..). По умолчанию для объекта, ссылки сравнены. Если бы Вы действительно изменяли его на структуру, то я полагаю, что это оценило бы к истинному на основе равенства членов парламента, не занимающих официального поста, но это все еще будет больше programmically звуковым для реализации IEquatable.

1
ответ дан 8 December 2019 в 12:24
поделиться

Для класса, с реализацией по умолчанию Равняется - она выдержит сравнение ссылкой.

При изменении его на tinyStruct это сравнит его значением.

2
ответ дан 8 December 2019 в 12:24
поделиться

Обязательно реализуйте .Equals (.. ) для вашей структуры, в качестве реализации по умолчанию может использоваться отражение для сравнения каждого поля, что очень дорого.

Подробнее читайте на: http://blogs.microsoft.co.il/blogs/sasha/archive/2007/08.aspx

0
ответ дан 8 December 2019 в 12:24
поделиться

это также может быть связано с тем, какой из экземпляров класса или структуры хранится в списке, поскольку равная реализация структур основана на равенстве значений

0
ответ дан 8 December 2019 в 12:24
поделиться