Упорядочивание AlphaNumeric в SQL по сравнению с LINQ и.NET

Редактирование: Справедливое замечание от комментатора. tmpnam не хороший выбор в эти дни; используйте mktemp / mkstemp вместо этого.

Исторический ответ: Будьте совместимым POSIX, и используйте tmpnam (который даст Вам полное имя файла во временном месте).

5
задан Joel Cochran 25 November 2009 в 16:03
поделиться

2 ответа

Вы можете использовать перегруженный метод OrderBy , который принимает IComparer. IComparer будет сравнивать элементы, чтобы получить желаемый результат:

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        double xNum, yNum;
        bool xIsNum = Double.TryParse(x, out xNum);
        bool yIsNum = Double.TryParse(y, out yNum);

        // compare numbers
        if (xIsNum && yIsNum)
        {
            return xNum.CompareTo(yNum);
        }

        // compare num to string
        if (xIsNum)
        {
            return 1;
        }

        // compare num to string
        if (yIsNum)
        {
            return -1;
        }

        // compare as strings
        return x.CompareTo(y);
    }
}

Использование:

list.OrderBy(i => i, new CustomComparer())

Реализация могла бы использовать Int32.TryParse для ваших конкретных данных образца, однако я использовал Double на всякий случай у вас в списке стоит "3.0" или что-то в этом роде. Конечно, вам нужно знать свои данные. Если значение слишком велико, необходимо использовать соответствующий метод TryParse.

2
ответ дан 15 December 2019 в 06:28
поделиться

В базах данных, в которых я пробовал (Oracle и SQL Server 2008), сортировка выполняется с использованием порядка ASCII (числа перед буквами такие же, как в запросе LINQ). Вы используете другую базу данных?

Запрос SQL Server:

SELECT 'A' col1 
UNION ALL
SELECT 'B' col1 
UNION ALL
SELECT '0' col1 
ORDER BY 1

Строки возвращаются как 0, A, B

Запрос Oracle:

SELECT 'A' col1 FROM dual
UNION ALL
SELECT 'B' col1 FROM dual
UNION ALL
SELECT '0' col1 FROM dual
ORDER BY 1

Строки возвращаются как 0, A, B

1
ответ дан 15 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

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