2013-11-25 3 views
3

У меня есть DataTableКак сортировать DataTable на основе нескольких столбцов?

Name Date 
bbb 01/01/2011 
bbb 01/01/2012 
aaa 01/01/2010 
aaa 01/01/2011 
bbb 01/01/2013 
aaa 01/01/2012 
bbb 01/01/2010 
ccc 01/01/2010 
aaa 01/01/2013 
ccc 01/01/2012 
ccc 01/01/2011 

Мне нужно сортировать эту таблицу сортировать по имени и каждое имя по дате:

Name Date 
aaa 01/01/2010 
aaa 01/01/2011 
aaa 01/01/2012 
aaa 01/01/2013 
bbb 01/01/2010 
bbb 01/01/2011 
bbb 01/01/2012 
bbb 01/01/2013 
ccc 01/01/2010 
ccc 01/01/2011 
ccc 01/01/2012 

Как сортировать DataTable в C#?

Я попытался следующие:

DataView dv = dt.DefaultView; 
    dv.Sort = "col1 desc"; 
    DataTable sortedDT = dv.ToTable(); 

, но этот вид только на 1 колонке ...

+0

принять Might взглянуть на это: http://stackoverflow.com/q/2777765/945456 –

ответ

2

http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

Все, что вам нужно сделать, это добавить запятую между столбцами в строке dv.Sort.

Для уточнения

dv.Sort = "Name, Date"; 
+1

OMG ! Извините ... Мне нужно удалить этот вопрос? Или принять и забыть? =) – Bryuk

+0

@Bryuk: Столбец 'Date'' DateTime' или 'String'? –

+0

String ... Но это работает! – Bryuk

2

Вы можете использовать LINQ для DataSet

var sortedDT = dt.AsEnumerable() 
       .OrderBy(r => r.Field<string>("Name")) 
       .ThenBy(r => r.Field<DateTime>("Date")) 
       .CopyToDataTable(); 

CopyToDataTable Использование метода для создания новый DataTable из упорядоченных строк.

+1

Спасибо, но кому было бы намного проще =) – Bryuk

+1

@Bryuk согласен, в этом конкретном случае, когда у вас есть DataView, сортировка по строкам выглядит более простой. Если позже вам потребуется более сложная сортировка, посмотрите на [Сортировка с помощью DataView] (http://msdn.microsoft.com/en-us/library/bb669083 (v = vs.110) .aspx) article –

2

Вы можете использовать Linq-To-DataSet:

var orderedRows = from row in dt.AsEnumerable() 
        orderby row.Field<string>("Name"), row.Field<DateTime>("Date") 
        select row; 
DataTable tblOrdered = orderedRows.CopyToDataTable(); 

Если Date столбец фактически столбец строки вам нужно разобрать его DateTime первым.

Предполагая, что допустимые форматы:

var orderedRows = from row in dt.AsEnumerable() 
        let date = DateTime.Parse(row.Field<string>("Date"), CultureInfo.InvariantCulture) 
        orderby row.Field<string>("Name"), date 
        select row; 
Смежные вопросы