Редактирование: Справедливое замечание от комментатора. tmpnam
не хороший выбор в эти дни; используйте mktemp
/ mkstemp
вместо этого.
Исторический ответ: Будьте совместимым POSIX, и используйте tmpnam (который даст Вам полное имя файла во временном месте).
Вы можете использовать перегруженный метод 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.
В базах данных, в которых я пробовал (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