Математика с перечислениями (например, DayOfWeek) в C#

В настоящее время в CI2 вы не можете получить доступ к методу Query Builder ($ this-> db -> _ compile_select ()) класса Database, не расширяя класс Database и не изменяя тип доступа метода с private на public / protected, что убивает способность создавать подзапросы так же, как вы пытаетесь построить с помощью класса ActiveRecord. Единственный способ создать подзапрос, подобный тому, который вы пытаетесь построить, - это просто использовать метод запроса db

$table = $this->db->dbprefix('tablename');

$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') ";
$this->db->query($sql,array($field1,$field2,$field3));  

. В блоге CI Subquerys было сообщение об этом, но он устарел и работает только на CI 1.7 Надеюсь, это немного поможет.

7
задан nicolaskruchten 24 July 2010 в 17:09
поделиться

3 ответа

Чтобы расширить то, что сказал Лассе (или, скорее, сделать его немного более явным).

Поскольку 0 может быть преобразован в тип Enum,

0 - endDate.DayOfWeek becomes 
(DayOfWeek)0 - endDate.DayOfWeek

И поскольку вы можете вычесть одно перечисление из другого и получить целочисленную разницу :

(DayOfWeek)0 - endDate.DayOfWeek == (int)endDate.DayOfWeek

Таким образом, поскольку результатом вычитания является int, вы можете добавить к нему 7.

endDate.AddDays(0-endDate.DayOfWeek + 7);

Итак, если значение Enum понедельника равно 1

0 - endDate.DayOfWeek == -1 + 7 == 6

Однако вы не можете сделать обратное.

endDate.DayOfWeek - 0 + 7, 

, поскольку тип результата вычисления зависит от крайней левой части. Таким образом, в то время как 0 - endDate.DayOfWeek дает целое число, endDate.DayOfWeek - 0 приводит к перечислению DayOfWeek.

Что наиболее интересно, вы можете использовать этот побочный эффект для получения значения перечисления без преобразования типов, хотя я бы Считайте это хакерским и запутанным ... так что следует избегать.

int enumValue = -(0 - endDate.DayOfWeek);
12
ответ дан 6 December 2019 в 09:21
поделиться

Это очень интересно. Правильный способ сделать это:

endDate.AddDays(7 - (int)endDate.DayOfWeek);

Но ваш вопрос не о решении, а о причине поведения. Это как-то связано с тем, как компилятор обрабатывает ноль. Любая линия не работает, если нет нуля, в то время как обе линии работают, если есть ноль.

4
ответ дан 6 December 2019 в 09:21
поделиться

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

using System;

namespace ConsoleApplication10
{
    public enum X { A, B, C, D }
    public class Program
    {
        static void Main()
        {
            var x = X.D + X.A;
            Console.Out.WriteLine(x);
            Console.In.ReadLine();
        }
    }
}

Распечатает 3.

Но вы не можете сложить, вероятно, не имеет смысла.

В случай «0», 0 автоматически конвертируется во все типы перечислений, поэтому в основном «0 - enumvalue» означает то же самое, что и «(enumtype) 0 - enumvalue», что снова работает.

4
ответ дан 6 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: