IamWsk Ответов: 1

Сортировка таблицы данных путем изменения типа столбца с помощью LINQ


Я хочу отсортировать столбец datatable string, но столбец с датой в формате (mm/dd/yyyy).

Что я уже пробовал:

Я попытался следовать, но данные не сортируются в правильном порядке.
dtData = dtData.AsEnumerable().OrderByDescending(r => (Convert.ToDateTime(r.Field<string>(ColumnName)))).CopyToDataTable();

1 Ответов

Рейтинг:
5

Karthik_Mahalingam

использовать значение datetime.Метод ParseExact [^]

dt = dt.AsEnumerable().OrderByDescending(r => (DateTime.ParseExact(r["DateColumnName"] + "", "mm/dd/yyyy", CultureInfo.InvariantCulture))).CopyToDataTable();


если вы беспокоитесь о null или другие строковые данные тогда значение datetime.Метод Метод Tryparseexact [^] было бы лучшим выбором
DataTable dt = new DataTable();
            dt.Columns.Add("DateColumnName");
            dt.Rows.Add("11/14/2017");
            dt.Rows.Add("11/13/2017");
            dt.Rows.Add("11/16/2017");

           

            dt.Columns.Add("NewColumnTemp");
            dt.AsEnumerable().ToList().ForEach(row =>
            {
                string date = row["DateColumnName"] + "";
                DateTime dateTemp;
                DateTime? dateTempNull = null;
                bool isValid = DateTime.TryParseExact(date, "mm/dd/yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTemp);
                row["NewColumnTemp"] = isValid ? dateTemp : dateTempNull;

            });
            DataView dv = dt.DefaultView;
            dv.Sort = "NewColumnTemp desc";
            dt = dv.ToTable();
            dt.Columns.Remove("NewColumnTemp");


IamWsk

Спасибо @Картик Бангалор. Будет ли он обрабатывать нулевые значения?Столбец также имеет некоторые нулевые или пустые значения.

Karthik_Mahalingam

обновили решение

IamWsk

Хорошо, позвольте мне применить решение.

IamWsk

Теперь он сортируется вот так
NewColumnTemp
31-01-2015
31-01-2014
30-01-2015

Karthik_Mahalingam

ММ/ДД/гггг

IamWsk

это происходит независимо от года, если вы видите.
Это должно быть как:
31-01-2015
30-01-2015
31-01-2014

Karthik_Mahalingam

Вы изменили формат на ДД-ММ-гггг ?

Karthik_Mahalingam

это прекрасно работает

 DataTable dt = new DataTable();
            dt.Columns.Add("DateColumnName");
            dt.Rows.Add("31-01-2015");
            dt.Rows.Add("31-01-2014");
            dt.Rows.Add("30-01-2015"); 

            dt.Columns.Add("NewColumnTemp");
            dt.AsEnumerable().ToList().ForEach(row =>
            {
                string date = row["DateColumnName"] + "";
                DateTime dateTemp;
                DateTime? dateTempNull = null;
                bool isValid = DateTime.TryParseExact(date, "mm-dd-yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTemp);
                row["NewColumnTemp"] = isValid ? dateTemp : dateTempNull;

            });
            DataView dv = dt.DefaultView;
            dv.Sort = "NewColumnTemp desc";
            dt = dv.ToTable();
            dt.Columns.Remove("NewColumnTemp");
            /*
             * 31-01-2015
             * 30-01-2015
             * 31-01-2014
             */

IamWsk

Пожалуйста, добавьте строки данных в нижеприведенном формате и попробуйте, это не сработает.
ДТ.Строк.Добавить("1/31/2015");
ДТ.Строк.Добавить("1/31/2014");
ДТ.Строк.Добавить("1/30/2015");
Как ваши данные в формате ММ/ДД/гггг, так и измените формат тоже.

Karthik_Mahalingam


            DataTable dt = new DataTable();
            dt.Columns.Add("DateColumnName");
            dt.Rows.Add("1/31/2015");
            dt.Rows.Add("1/31/2014");
            dt.Rows.Add("1/30/2015");

            dt.Columns.Add("NewColumnTemp",typeof(DateTime));
            dt.AsEnumerable().ToList().ForEach(row =>
            {
                string date = row["DateColumnName"] + "";
                DateTime dateTemp;
                DateTime? dateTempNull = null;
                bool isValid = DateTime.TryParseExact(date, new string[] { "M/dd/yyyy", "MM/dd/yyyy", "M/d/yyyy", "MM/d/yyyy" }, CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTemp);
                row["NewColumnTemp"] = isValid ? dateTemp : dateTempNull;

            });
            DataView dv = dt.DefaultView;
            dv.Sort = "NewColumnTemp desc";
            dt = dv.ToTable();
            dt.Columns.Remove("NewColumnTemp");
            

IamWsk

Он все еще делал строковый столбец, поэтому я сделал его Datetime, и наконец он работает.
ДТ.колонны.Добавить("DateColumnName",typeof(DateTime));
объект dateTempNull = DBNull.Ценность;

Спасибо, Картик, пожалуйста, дай звезды на мой вопрос.

Karthik_Mahalingam

крутой